如果两个字典的键相等,则使用两个值执行操作并移动到新的字典(python)

lam*_*_xx 4 python dictionary loops compare

我有两个字典,像这样:

d1 = {'red':10, 'blue':20, 'green':30, 'yellow':40}
d2 = {'red':1, 'blue':2, 'green':3}
Run Code Online (Sandbox Code Playgroud)

我想通过d1中的每个项目查看密钥是否与d2中的密钥匹配.如果是这样,我想从d1键中减去d2键,并将新的键/值对移动到新的字典中,从而导致:

d3 = {'red':9, 'blue':18, 'green':27, 'yellow':40}
Run Code Online (Sandbox Code Playgroud)

我编写了以下脚本来执行此操作:

for x, y in d1.items():
    for a, b in d2.items():
        if x == a:
            d3[x] = (y-b)
        elif x not in d2.items():
            d3[x] = y
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是当我尝试在包含数千个项目的两个词典中使用它时,该功能永远不会完成.我想这太慢了.

你能推荐一个更好的方法吗?非常感谢.

Wil*_*sem 7

是的,你让事情变得太复杂,只需使用字典理解:

{k:v1-d2.get(k,0) for k,v1 in d1.items()}
Run Code Online (Sandbox Code Playgroud)

这将产生:

>>> {k:v1-d2.get(k,0) for k,v1 in d1.items()}
{'red': 9, 'blue': 18, 'green': 27, 'yellow': 40}
Run Code Online (Sandbox Code Playgroud)

代码的工作原理如下:字典理解将遍历items()of d1,其中k键和v1值的d1关联k.

然后,对于每个这样的键值对,我们将v1-d2.get(k,0)k结果字典中的键相关联.d2.get(k,0)将旨在获取与之关联的值k,如果该键不在字典中,它将返回0.

算法运行 - 给定字典查找可以在O(1)中发生(不保证,但非常可能) - 在O(n)中,n中元素的数量d1,因此相当快.

  • @ddrsee:在SO上更新了关于字典理解的文档. (2认同)