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太酷了.
| 归档时间: |
|
| 查看次数: |
32531 次 |
| 最近记录: |