Извлечение элементов из двух списков диктовок, если другие элементы совпадают с использованием понимания - PullRequest
0 голосов
/ 21 ноября 2018

Как я могу перебрать два списка диктов, сопоставить клики между списками по ключу и, если есть совпадение, добавить конкретный ключ из каждого дикта в пару значений ключа в новом словаре.Позвольте мне уточнить на примере:

l1 = [{'id': 52, 'email': 'someemail@yahoo.com', 'anotherfield': 'some value'},
       .....
      {'id': 98, 'email': 'anotheremail@yahoo.com', 'anotherfield': 'another value'}]

l2 = [{'id': 93, 'email': 'someemail@yahoo.com', 'another key': 'seventeen'},
       .....
      {'id': 101, 'email': 'anotheremail@yahoo.com', 'another key': 'twenty'}]


# match the 'email' keys between each list, and if match, create k, v pair from id's

desired_output = {'52': 93.....'98': 101}

Я могу легко добиться этого, просто перебирая каждый список следующим образом:

lookup = dict()
for l in l1:
    for p in l2:
        if l['email']==p['email']:
            lookup[l['id']]=p['id']
            break

Однако это немного неуклюже, и я быпредпочитаю какое-то понимание.Моя попытка:

lookup = {k['id']: v['id'] for k, v in zip(l1, l2) if k['email'] == v['email']}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Решение для списков непоследовательности:

l1 = [{"email": "email1", "id": 1}, {"email": "email2", "id": 2}, {"email": "email3", "id": 3}]
l2 = [{"email": "email2", "id": 22}, {"email": "email4", "id": 4}, {"email": "email1", "id": 11}, ]

emails = {}
lookup = {}

for el in l1:
    emails[el["email"]] = el["id"]

for el in l2:
    email = el["email"]
    if email in emails:
        lookup[emails[email]] = el["id"]

# {1: 11, 2: 22}
print(lookup)

# bad solution from question
lookup = {k['id']: v['id'] for k, v in zip(l1, l2) if k['email'] == v['email']}

# {} - empty
print(lookup)

Если вам нужно больше списков - расширьте решение, обновите словарь электронных писем по всем циклам, прежде чем завершить цикл

0 голосов
/ 21 ноября 2018

Попробуйте это:

from itertools import product
lookup = {k['id']: v['id'] for k, v in product(l1, l2) if k['email'] == v['email']}
...