Python 如何比较两本词典?

Python 如何比较两本词典?,python,if-statement,dictionary,Python,If Statement,Dictionary,我有两本字典 dict_a = {'x' : 2, 'y' : 3.5, 'z' : 4} dict_b = {'bob' : ['x', 'y'], 'john' : ['z', 'x'], 'bill' : ['y']} 我想比较这两个字典并创建一个新字典,如果dict_b中的值匹配,则使用dict_b中的键和dict_a中的值。我希望看到: new_dict = {'bob' : [2, 3.5], 'john' : [4, 2], 'bill' : [3.5]} 我尝试了以下代码:

我有两本字典

dict_a = {'x' : 2, 'y' : 3.5, 'z' : 4}
dict_b = {'bob' : ['x', 'y'], 'john' : ['z', 'x'], 'bill' : ['y']}
我想比较这两个字典并创建一个新字典,如果
dict_b
中的值匹配,则使用
dict_b
中的键和
dict_a
中的值。我希望看到:

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'未定义
,但我不确定如何定义'I'


感谢您的帮助

这可以通过简单的听写理解来完成:

>>> {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]}
new_dict = { name: [dict_a[guess] for guess in guesses if guess in dict_a] for name, guesses in dict_b.items() }
这将用
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)

这可以通过简单的听写理解来完成:

>>> {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]}
new_dict = { name: [dict_a[guess] for guess in guesses if guess in dict_a] for name, guesses in dict_b.items() }
这将用
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)
就像这样:

new_dict = {name: [dict_a[k] for k in dict_b[name]] for name in` dict_b.keys()}
就像这样:

new_dict = {name: [dict_a[k] for k in dict_b[name]] for name in` dict_b.keys()}
这并没有达到您期望的效果。Python在这里链接操作符,因此您的测试相当于以下内容:

(guess == i) and (i in dict_a.values())
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
因此,这不像在这里执行for循环,在这里迭代字典值中的变量
i

此外,您实际上需要从这些多个键中收集值,因此您希望在这里执行以下操作:

(guess == i) and (i in dict_a.values())
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]
最后,你甚至可以将此与口述理解结合起来:

>>> {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]}
new_dict = { name: [dict_a[guess] for guess in guesses if guess in dict_a] for name, guesses in dict_b.items() }
这并没有达到您期望的效果。Python在这里链接操作符,因此您的测试相当于以下内容:

(guess == i) and (i in dict_a.values())
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
因此,这不像在这里执行for循环,在这里迭代字典值中的变量
i

此外,您实际上需要从这些多个键中收集值,因此您希望在这里执行以下操作:

(guess == i) and (i in dict_a.values())
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]
最后,你甚至可以将此与口述理解结合起来:

>>> {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]}
new_dict = { name: [dict_a[guess] for guess in guesses if guess in dict_a] for name, guesses in dict_b.items() }