обновить список dict по ключу из другого списка dict - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть два списка диктов:

a = [{'id': 1}, {'id': 2}, {'id': 3}, {'id': 4}]
b = [{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test'}, {'id': 3, 'name': 'test'}, {'id': 4, 'name': 'test'}, {'id': 5, 'name': 'test'}]

Мне нужно обновить дикты в a ключом 'name' из кодов b ключом 'id'. Результат, который я ожидал:

a = [{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test'}, {'id': 3, 'name': 'test'}, {'id': 4, 'name': 'test'}]

Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 28 апреля 2020

Сначала необходимо создать «индекс» словарей в списке b, затем вы можете обновить список a, используя понимание списка:

ib = { d["id"]:d for d in b }
a  = [ {**d,**ib.get(d["id"],{})} for d in a ]
2 голосов
/ 28 апреля 2020

Это, вероятно, процесс filter, сначала получите список области действия фильтра и выполните фильтр

a = [{'id': 1}, {'id': 2}, {'id': 3}, {'id': 4}]
b = [{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test'}, {
    'id': 3, 'name': 'test'}, {'id': 4, 'name': 'test'}, {'id': 5, 'name': 'test'}]
print(list(filter(lambda x: x['id'] in [i['id'] for i in a], b)))

Результат:

[{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test'}, {'id': 3, 'name': 'test'}, {'id': 4, 'name': 'test'}]
1 голос
/ 28 апреля 2020

Преобразование a в набор идентификаторов для поиска членства также может быть решением:

ids = {x["id"] for x in a}

result = [x for x in b if x["id"] in ids]

print(result)
# [{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test'}, {'id': 3, 'name': 'test'}, {'id': 4, 'name': 'test'}]
...