您希望拥有一个包含值列表的键的有序词典。
从下面的代码我可以得到一个包含密钥列表的字典,但缺少插入序列。
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对象按定义无序。
我知道如果你需要插入值的顺序(在Python 2.7和3.x中可用),我们需要使用 OrderedDict
所以改变我的代码如下
从下面的代码我能够得到我需要的东西。
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'
任何人都能告诉我如何得到我想要的东西。
答案 0 :(得分:3)
试试这个:
from collections import OrderedDict
keys=['blk','pri','ani']
vals1=['blocking','primary','anim']
vals2=['S1','S2','S3']
print OrderedDict(zip(keys, zip(vals1, vals2)))
答案 1 :(得分:3)
围绕OrderedDict
包裹defaultdict(list)
的问题在于它是以这种方式评估的:
defaultdict
。OrderedDict
的实例,然后使用defaultdict
(当前为空)的内容对其进行初始化,然后丢弃旧defaultdict
,因为没有任何内容再引用它。这并没有像你想要的那样结合他们的行为。
我见过的标准习语是dict.setdefault
方法。
from collections import OrderedDict
keys=['blk','pri','ani']
vals1=['blocking','primary','anim']
vals2=['S1','S2','S3']
dic = OrderedDict()
i=0
for key in keys:
dic.setdefault(key, []).append(vals1[i])
dic.setdefault(key, []).append(vals2[i])
i += 1
print dic
与defaultdict一样,这会在您第一次访问它时创建一个值,尽管我收集它的效率会低一些。
我会使用这种方法:
from collections import OrderedDict
dic = OrderedDict(zip(keys, zip(vals1, vals2)))
print dic