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

Rao*_*Rao 10 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
Run Code Online (Sandbox Code Playgroud)

我得到以下结果

defaultdict(<type 'list'>, {'pri': ['primary', 'S2'], 'ani': ['anim', 'S3'], 'blk': ['blocking', 'S1']})
Run Code Online (Sandbox Code Playgroud)

在这里我丢失了插入订单.

我知道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
Run Code Online (Sandbox Code Playgroud)

现在我得到以下错误

Traceback (most recent call last):
  File "Dict.py", line 18, in <module>
    dic[key].append(vals1[i])
KeyError: 'blk' 
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何得到我想要的东西.

mgi*_*son 10

如果你真的想要"有序" "默认"行为,我想我会创建一个自定义字典类来为我处理一切:

from collections import OrderedDict

class DefaultListOrderedDict(OrderedDict):
    def __missing__(self,k):
        self[k] = []
        return self[k]

keys=['blk','pri','ani']
vals1=['blocking','primary','anim']
vals2=['S1','S2','S3']
dic = DefaultListOrderedDict()
for i,key in enumerate(keys):
    dic[key].append(vals1[i])
    dic[key].append(vals2[i])

print dic
Run Code Online (Sandbox Code Playgroud)

defaultdict将比其他解决方案更像,但它将保留它的顺序,它真的不是很多代码:).最后,您甚至可以覆盖__init__以允许用户通过他们想要的任何"工厂"(而不是硬编码list).我会把它留作感兴趣的读者的练习.Python太酷了.