【问题标题】:OrderedDict KeyErrorOrderedDict KeyError
【发布时间】:2013-03-07 23:06:10
【问题描述】:
import collections

d = collections.defaultdict(dict)

d["i"]["a"] = "111"
d["i"]["b"] = "222"

print d

od = collections.OrderedDict()

od["i"]["a"] = "111"
od["i"]["b"] = "222"

print od

输出:

defaultdict(<type 'dict'>, {'i': {'a': '111', 'b': '222'}})
Traceback (most recent call last):
  File "app_main.py", line 51, in run_toplevel
  File "/Users/adam/Desktop/collections.py", line 12, in <module>
    od["i"]["a"] = "111"
KeyError: 'i'

为什么 OrderedDict 出现关键错误以及我能做些什么?

谢谢。

【问题讨论】:

    标签: python collections dictionary comparison


    【解决方案1】:

    OrderedDict 不也是 defaultdict。你必须这样做:

    import collections
    od = collections.OrderedDict()
    od["i"] = collections.OrderedDict()
    od["i"]["a"] = "111"
    od["i"]["b"] = "222"
    print od
    

    输出:

    OrderedDict([('i', OrderedDict([('a', '111'), ('b', '222')]))])
    

    请参阅 this answer 了解潜在的有序 ​​defaultdict 实现。

    【讨论】:

    • 这样我丢失了插入顺序,这就是我使用 OrderedDict 的原因
    • @AdamSilver:然后使用OrderedDict 来作为内部的。我更新了我的答案。
    【解决方案2】:

    这就是 defaultdict 的主要优点,它会捕获 Keyerror 并调用作为参数传递给 defaultdict 的函数。但是 OrderedDict 的用途不同。

    如果一个新的数据结构结合了这两个功能将是有益的。此外,使用 userDict() 必须可以实现这样的功能。

    你可以参考我关于 Python Collections 的文章

    https://techietweak.wordpress.com/2015/11/11/python-collections/

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2016-02-03
      • 2019-01-16
      • 2020-03-26
      • 2016-04-20
      • 2019-05-01
      相关资源
      最近更新 更多