比较两个大词典并为它们共有的键创建值列表

aha*_*jib 20 python dictionary

我有两个词典,如:

dict1 = { (1,2) : 2, (2,3): 3, (1,3): 3}
dict2 = { (1,2) : 1, (1,3): 2}
Run Code Online (Sandbox Code Playgroud)

我想要的输出是两个字典中存在的项目的两个值列表:

[2,3]
[1,2]
Run Code Online (Sandbox Code Playgroud)

我现在正在做的是这样的:

list1 = []
list2 = []

for key in dict1.keys():
    if key in dict2.keys():
        list1.append(dict1.get(key))
        list2.append(dict2.get(key))
Run Code Online (Sandbox Code Playgroud)

这段代码运行时间太长,这不是我期待的.我想知道是否有更有效的方法吗?

Bla*_*ear 28

commons = set(dict1).intersection(set(dict2))
list1 = [dict1[k] for k in commons]
list2 = [dict2[k] for k in commons]
Run Code Online (Sandbox Code Playgroud)

  • @BlackBear - 您实际上可以在不构建其他集合的情况下获取交集.python2.x上的`common = dict1.viewkeys()&dict2`,或python3.x上的`common - dict1.keys()&dict2` (3认同)

mgi*_*son 14

不要用dict.keys.在python2.x上,它每次调用时都会创建一个新列表(这是一个O(N)操作 - 平均来说list.__contains__是另一个O(N)操作).只是依赖于字典是可迭代容器的直接事实(使用O(1)查找):

list1 = []
list2 = []

for key in dict1:
    if key in dict2:
        list1.append(dict1.get(key))
        list2.append(dict2.get(key))
Run Code Online (Sandbox Code Playgroud)

请注意,在python2.7上,您可以使用viewkeys直接获取交集:

>>> a = {'foo': 'bar', 'baz': 'qux'}
>>> b = {'foo': 'bar'}
>>> a.viewkeys() & b
set(['foo'])
Run Code Online (Sandbox Code Playgroud)

(在python3.x上,你可以keys在这里使用而不是viewkeys)

for key in dict1.viewkeys() & dict2:
    list1.append(dict1[key]))
    list2.append(dict2[key]))
Run Code Online (Sandbox Code Playgroud)