如何在python中使用OrderedDict为键分配值列表

时间:2012-11-07 07:21:42

标签: python dictionary

您希望拥有一个包含值列表的键的有序词典。

从下面的代码我可以得到一个包含密钥列表的字典,但缺少插入序列。

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' 

任何人都能告诉我如何得到我想要的东西。

2 个答案:

答案 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)的问题在于它是以这种方式评估的:

  1. 创建defaultdict
  2. 的空实例
  3. 创建OrderedDict的实例,然后使用defaultdict(当前为空)的内容对其进行初始化,然后丢弃旧defaultdict,因为没有任何内容再引用它。
  4. 这并没有像你想要的那样结合他们的行为。

    我见过的标准习语是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