2016-10-08 50 views
0

我有两个字典我如何比较2个字典?

dict_a = {'x' : 2, 'y' : 3.5, 'z' : 4} 
dict_b = {'bob' : ['x', 'y'], 'john' : ['z', 'x'], 'bill' : ['y']} 

我想比较两个库和dict_a创建一个新的与dict_b键和值如果值从dict_b比赛。我希望看到:

new_dict = {'bob' : [2, 3.5], 'john' : [4, 2], 'bill' : [3.5]} 

我曾尝试下面的代码:

for name, guess in dict_b.items(): 
    if guess == i in dict_a.values(): 
     new_dict[name].append(i) 
print(new_dict) 

我得到的错误NameError: name 'i' is not defined,但我不知道如何定义“我”。

感谢所有帮助

回答

1

这可以用一个简单的字典理解来完成:

>>> {k: [dict_a.get(x,x) for x in v] for k, v in dict_b.items()} 
{'bob': [2, 3.5], 'john': [4, 2], 'bill': [3.5]} 

这与那些从dict_a如果存在替代值。否则,请保留dict_b.get(x,x)中的第二个参数)。

另外,修复原有的代码是这样的:

new_dict = {} 
for name, guess in dict_b.items(): 
    new_dict[name] = [] 
    for value in guess: 
     if value in dict_a: 
      new_dict[name].append(dict_a[value]) 
print(new_dict) 
3

以及像这样:

new_dict = {name: [dict_a[k] for k in dict_b[name]] for name in` dict_b.keys()} 
2
if guess == i in dict_a.values(): 

这不会做你希望它做什么。这里的Python连锁运营商,所以你的测试等同于以下内容:

(guess == i) and (i in dict_a.values()) 

所以它不喜欢的for循环在这里执行,你遍历字典中的值的变量i

此外,你实际上需要从那些多个键收集值,所以你会想在这里做的是以下几点:

new_dict = {} 
for name, guesses in dict_b.items(): 
    result = [] 
    for guess in guesses: 
     if guess in dict_a: 
      result.append(dict_a[guess]) 
    new_dict[name] = result 

然后,你也可以使用列表解析来缩短这个:

new_dict = {} 
for name, guesses in dict_b.items(): 
    new_dict[name] = [dict_a[guess] for guess in guesses if guess in dict_a] 

最后,你甚至可以用字典的理解结合本:

new_dict = { name: [dict_a[guess] for guess in guesses if guess in dict_a] for name, guesses in dict_b.items() }