【发布时间】:2012-11-07 07:21:42
【问题描述】:
您好想要一个有序字典,其中的键具有值列表。
从下面的代码中,我可以得到一个包含键列表的字典,但插入的顺序丢失了。
from collections import defaultdict
keys=['blk','pri','ani']
vals1=['blocking','primary','anim']
vals2=['S1','S2','S3']
dic = defaultdict(list)
i=0
for key in keys:
dic[key].append(vals1[i])
dic[key].append(vals2[i])
i += 1
print dic
我得到以下结果
defaultdict(<type 'list'>, {'pri': ['primary', 'S2'], 'ani': ['anim', 'S3'], 'blk': ['blocking', 'S1']})
这里我丢失了插入顺序。
我知道 Python 中的 defaultdict 对象是按定义无序的。
如果您需要插入值的顺序,我知道我们需要使用 OrderedDict(它在 Python 2.7 和 3.x 中可用)
所以修改了我的代码如下
从下面的代码我可以得到我需要的东西。
from collections import defaultdict,OrderedDict
keys=['blk','pri','ani']
vals1=['blocking','primary','anim']
vals2=['S1','S2','S3']
dic = OrderedDict(defaultdict(list))
i=0
for key in keys:
dic[key].append(vals1[i])
dic[key].append(vals2[i])
i += 1
print dic
现在我得到以下错误
Traceback (most recent call last):
File "Dict.py", line 18, in <module>
dic[key].append(vals1[i])
KeyError: 'blk'
谁能告诉我如何得到我正在尝试的东西。
【问题讨论】:
-
附带说明,您几乎从不想维护这样的显式循环计数器。只是
for i, key in enumerate(keys):。 (实际上,在这种情况下,您甚至不需要循环计数器。只需for key, val1, val2 in zip(keys, vals1, vals2):。) -
另外,您真的需要保留插入顺序吗?通常,新手会要求这样做,但解决实际问题的正确方法实际上并不需要它。事实上,这种情况非常普遍,以至于在标准库中添加
OrderedDict存在严重的阻力,因为担心它会鼓励滥用。 (IIRC,它在 2.4、2.5 和 2.6 中被拒绝,最终在 3.0 和 2.7 中被接受。) -
@abarnert,是的,我真的需要它。我为它创建了自己的课程,它解决了我的问题。
标签: python dictionary