查找字典值列表的交集

问题描述 投票:2回答:2

我有两个具有相同键的字典,而值是不同的:

a = {1: [1, 2, 3, 4, 5], 2: [6, 7, 8], 3: [1, 3, 5, 7, 9]}
b = {1: [2, 3, 4, 7], 2: [6, 7], 3: [1, 3, 15, 10]}

我正在尝试使交集使用相同的键。我想要这个输出:

{1: [2, 3, 4], 2: [6, 7], 3: [1, 3]}

我尝试使用此命令:

dict(zip(a.keys() and b.keys(), a.values() and b.values()))
output: {1: [2, 3, 4, 7], 2: [6, 7], 3: [1, 3, 15, 10]}

但是,输出如下,这是错误的:

{1: [2, 3, 4, 7], 2: [6, 7], 3: [1, 3, 15, 10]}
python dictionary
2个回答
2
投票

我认为这很清楚。如果没有,请要求澄清。

假设,

我有两个具有相同键的字典

a = {1: [1, 2, 3, 4, 5], 2: [6, 7, 8], 3: [1, 3, 5, 7, 9]}
b = {1: [2, 3, 4, 7], 2: [6, 7], 3: [1, 3, 15, 10]}
c = {}

for key, val in a.items():
    c[key] = []
    for i in val:
        if i in b[key]:
            c[key].append(i)

print(c)

输出为:

{1: [2, 3, 4], 2: [6, 7], 3: [1, 3]}

0
投票

如果您知道字典具有相同的键,则可以这样做

c = {}
for key, list_a, list_b in zip(a.keys(), a.values(), b.values()):
    c[key] = [value for value in list_a if value in list_b]

或:

c = {}
for key, list_a, list_b in zip(a.keys(), a.values(), b.values()):
    c[key] = list(set(list_a).intersection(list_b))

如果不确定它们具有相同的键,只需添加一个条件,例如

c = {}
for key_a, list_a, key_b, list_b in zip(a.keys(), a.values(), b.keys(), b.values()):
    if key_a == key_b:
        c[key_a] = [value for value in list_a if value in list_b]

如果要考虑性能,我发现第一个解决方案是最快的解决方案

from time import time
t0 = time()
for i in range(1000000):
    c = {}
    for key, list_a, list_b in zip(a.keys(), a.values(), b.values()):
        c[key] = [value for value in list_a if value in list_b]
t0 = time() - t0
c, t0

输出:

({1: [2, 3, 4], 2: [6, 7], 3: [1, 3]}, 4.157890558242798)
t1 = time()
for i in range(1000000):
    c = {}
    for key, list_a, list_b in zip(a.keys(), a.values(), b.values()):
        c[key] = list(set(list_a).intersection(list_b))
t1 = time() - t1
c, t1

输出:

({1: [2, 3, 4], 2: [6, 7], 3: [1, 3]}, 5.214516639709473)
© www.soinside.com 2019 - 2024. All rights reserved.