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() }