两个dict-Python列表的交集

两个dict-Python列表的交集,python,list,dictionary,list-comprehension,Python,List,Dictionary,List Comprehension,我有两张单子 listA = [{'id': 'abc', 'key1': '542696d8485b'}] listB = [{'id': 'abc', 'key1': '542696d8485b'}, {'id': 'def', 'key1': '27348628grn'}] 我想提取listC=[{'id':'abc','key1':'542696d8485b'}] i、 e我想根据“id”字段(基于任何一个字段,假设列表中的公共项完全相同)查找交叉点。建议我一些有效的肾盂疗法 像这样的

我有两张单子

listA = [{'id': 'abc', 'key1': '542696d8485b'}]
listB = [{'id': 'abc', 'key1': '542696d8485b'}, {'id': 'def', 'key1': '27348628grn'}]
我想提取
listC=[{'id':'abc','key1':'542696d8485b'}]

i、 e我想根据“id”字段(基于任何一个字段,假设列表中的公共项完全相同)查找交叉点。建议我一些有效的肾盂疗法

像这样的怎么样

listA_set = set(item['id'] for item in listA)
listB_set = set(item['id'] for item in listB)
listC_set = listA_set & listB_set
listC = {item:listA[item] for item in listC_set}

为什么不使用列表理解:

listA = [{'id': 'abc', 'key1': '542696d8485b'}]
listB = [{'id': 'abc', 'key1': '542696d8485b'}, {'id': 'def', 'key1': '27348628grn'}]

print [i for i in listA for j in listB if i['id']==j['id']]

你可以只使用一个简单的过滤

b_ids = set(d["id"] for d in listB)
result = [d for d in listA if d["id"] in b_ids]

假设您希望将字典从
listA
中保留,而另一个字典可能具有相同的
“id”
值在
列表B中

如果
id
相同但
key1
不同,那么
key1的值应该是什么?我认为两个列表中提到的值完全相同,仍然更新了我的问题-我想现在更好了。@Nish你认为使用集合比列表更好吗?有趣的是,这个问题有多个下行投票,而上行投票……我的方法呢?-见编辑后的问题。您正在迭代完整的listB ID。@Nish:我已经从
listB
中的ID构建了一个集合,因此在列表理解中使用的
是O(1)。两个列表中的每一个都只被完整地迭代一次,唯一不需要的情况是其中一个列表为空。您的示例还将迭代两个完整列表(在构建集合时),然后在交叉点上进行另一次迭代。