Python:将字典值与另一个字典键匹配

时间:2013-06-04 07:32:29

标签: python dictionary

我有两个以这种方式创建的词典:

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])

任何帮助将不胜感激。感谢。

6 个答案:

答案 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]