Найти и удалить dict из одного из двух списков dicts, если есть пара ключ-значение, отсутствующая хотя бы в одном из списков - PullRequest
0 голосов
/ 01 июня 2018

После определенных манипуляций я получаю два списка словарей, отсортированных по ключу numeric_id.Давайте скажем, у меня есть

list1 = [
        {'ref': 'link1', 'numeric_id': 1},
        {'ref': 'link2', 'numeric_id': 2},
        {'ref': 'link3', 'numeric_id': 3},
        {'ref': 'link4', 'numeric_id': 4},
        {'ref': 'link5', 'numeric_id': 5}
]

list2 = [
        {'ref': 'different_link1', 'numeric_id': 1},
        {'ref': 'different_link2', 'numeric_id': 2},
        {'ref': 'different_link4', 'numeric_id': 4},
        {'ref': 'different_link5', 'numeric_id': 5}
]

И во втором списке значение 3 в ключе "numeric_id" отсутствует, в то время как первый список содержит такую ​​пару ключ-значение.Затем я должен удалить этот словарь из списка 1, так как мне нужно, чтобы в обоих списках были только совпадающие пары, основанные на numeric_id.Также может быть обратный случай, когда значение отсутствует в первом списке, а во втором.Я не знаю заранее, что будет.

Результатом должно быть два списка без каких-либо непарных элементов.Поскольку списки содержат словари с разными ссылками, единственное соединение между ними - это значение ключа numeric_id

Задача казалась довольно простой, но я уже совсем растерялся.Не могли бы вы помочь?Нашел много похожих вопросов, но не смог найти правильное решение для моего случая.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Может быть, вы можете попробовать это:
1. извлечь numeric_id из list2
2. добавить каждый элемент list1, если его numeric_id находится в list2

list2_numeric_id = [element["numeric_id"] for element in list2]
[element for element in list1 if element["numeric_id"] in list2_numeric_id]
>> [{'numeric_id': 1, 'ref': 'link1'}, {'numeric_id': 2, 'ref': 'link2'}, {'numeric_id': 4, 'ref': 'link4'}, {'numeric_id': 5, 'ref': 'link5'}]
0 голосов
/ 01 июня 2018

Вы можете использовать filter:

list1 = [{'numeric_id': 1, 'ref': 'link1'}, {'numeric_id': 2, 'ref': 'link2'}, {'numeric_id': 3, 'ref': 'link3'}, {'numeric_id': 4, 'ref': 'link4'}, {'numeric_id': 5, 'ref': 'link5'}]
list2 = [{'numeric_id': 1, 'ref': 'link1'}, {'numeric_id': 2, 'ref': 'link2'}, {'numeric_id': 4, 'ref': 'link4'}, {'numeric_id': 5, 'ref': 'link5'}]
new_list1 = list(filter(lambda x:any(c['numeric_id'] == x['numeric_id'] for c in list2), list1))
new_list2 = list(filter(lambda x:any(c['numeric_id'] == x['numeric_id'] for c in list1), list2))

Выход:

[{'numeric_id': 1, 'ref': 'link1'}, {'numeric_id': 2, 'ref': 'link2'}, {'numeric_id': 4, 'ref': 'link4'}, {'numeric_id': 5, 'ref': 'link5'}]
[{'numeric_id': 1, 'ref': 'link1'}, {'numeric_id': 2, 'ref': 'link2'}, {'numeric_id': 4, 'ref': 'link4'}, {'numeric_id': 5, 'ref': 'link5'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...