我有两个以这种方式创建的词典:
tr = defaultdict(list)
tr = { 'critic' : '2_critic',
'major' : '3_major',
'all' : ['2_critic','3_major']
}
第二个:
scnd_dict = defaultdict(list)
并包含如下值:
scnd_dict = {'severity': ['all']}
我希望第三个字典包含scnd_dict
的密钥及其tr
的对应值。
这样,我会:
third_dict = {'severity' : ['2_critic','3_major']}
我尝试了这个,但它不起作用:
for (k,v) in scnd_dict.iteritems() :
if v in tr:
third_dict[k].append(tr[v])
任何帮助将不胜感激。感谢。
答案 0 :(得分:1)
您的问题是v
是列表,而不是列表项。因此,if v in tr:
将是错误的。更改代码,以便迭代v
答案 1 :(得分:1)
嗯...
from collections import defaultdict
tr = {'critic' : '2_critic',
'major' : '3_major',
'all' : ['2_critic','3_major']}
scnd_dict = {'severity': ['all']}
third_dict = {}
for k, v in scnd_dict.iteritems():
vals = []
if isinstance(v, list):
for i in v:
vals.append(tr.get(i))
else:
vals.append(tr.get(v))
if not vals:
continue
third_dict[k] = vals
print third_dict
结果:
>>>
{'severity': [['2_critic', '3_major']]}
会做你想做的事。但我质疑在这里使用defaultdicts的逻辑,或者让你的索引成为列表的一部分......
如果您使用scnd_dict
的非列表,那么您可以更轻松地完成整个事情。假设scnd_dict
看起来像这样:scnd_dict = {'severity': 'all'}
:
d = dict((k, tr.get(v)) for k, v in scnd_dict.items())
# {'severity': ['2_critic', '3_major']}
答案 2 :(得分:0)
third_dict = {k: tr[v[0]] for k, v in scnd_dict.iteritems() if v[0] in tr}
这个
tr = defaultdict(list)
如果您只是在下一行重新绑定tr
,那么会浪费时间。同样适用于scnd_dict
。
将所有值设为tr
列表是一个更好的主意 - 即使它们只有一个项目。这意味着稍后会担心的特殊情况会减少。
答案 3 :(得分:0)
third_dict = {k: [t for m in ks for t in tr[m]] for k,ks in scnd_dict.iteritems()}
答案 4 :(得分:0)
第二个dict的值是list,而不是str,所以代码打击将起作用
for (k, v) in send_dict.iteritems():
if v[0] in tr.keys():
third_dict[k] = tr[v[0]]
答案 5 :(得分:0)
问题是第三个字典不知道值是列表
for k in scnd_dict:
for v in scnd_dict[k]:
print v
for k2 in tr:
if v==k2:
if k not in third_dict:
third_dict[k]=tr[k2]
else:
third_dict[k]+=tr[k2]