Найти пересечение списка значений словаря - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть два словаря с одинаковыми ключами, но значения разные:

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]}

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Я думаю, это довольно ясно. Если нет, пожалуйста, попросите разъяснений.

Предполагая,

У меня есть два словаря с одинаковыми клавишами

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]}
1 голос
/ 08 апреля 2020
c= {key:list(set(a[key]) & set(b[key])) for key in a}

Объяснение: используя словарь, я прошел каждый ключ 'a' и создал пересечение списка значений, соответствующих этому ключу, в обоих словарях 'a' & 'b'

1 голос
/ 08 апреля 2020

Если вы знаете, что словари имеют одинаковые ключи, вы можете набрать

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]
...