在某些操作之后,我得到两个按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}
]
在第二个列表中," numeric_id"中的值为3当第一个列表包含这样的键值对时,键不存在。然后我必须从列表1中删除这个字典,因为我需要在两个列表中只有基于numeric_id的匹配对。 当第一个列表中不存在该值时,也可以是相反的情况,而第二个列表中的值则不同。我不知道事先会发生什么。
结果应该是两个列表,没有任何不成对的元素。由于列表包含具有不同链接的词典,因此它们之间的唯一连接是numeric_id键的值
这项任务似乎很容易,但我已经迷失了。 能否请你帮忙? 发现了很多类似的问题,但无法找到适合我案例的解决方案。
提前致谢!
答案 0 :(得分:1)
您可以使用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'}]
答案 1 :(得分:0)
也许你可以试试这个:
1.从numeric_id
中提取list2
2.如果list1
的{{1}}位于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'}]