两个dict列表的交集 - Python

时间:2014-04-12 12:00:31

标签: python list dictionary list-comprehension

我有两个dict列表

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

我想提取listC = [{'id': 'abc', 'key1': '542696d8485b'}]

即我想找到基于' id'字段(基于任何一个字段,假设列表中的公共项完全相同)。建议我一些有效的pythonic方式...

这样的东西
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}

3 个答案:

答案 0 :(得分:7)

为什么不使用列表理解:

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']]

答案 1 :(得分:1)

您可以使用简单的过滤

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

假设您希望在listA中具有相同"id"值的可能不同的字典时保留字典listB

答案 2 :(得分:1)

我会创建两个集合并使用交集创建一个新字典

d1 = {'a' : 1}
d2 = {'a' : 4, 'b' : 7}

s1 = set(d1.keys())
s2 = set(d2.keys())
s3 = s2.intersection(s1)

d3 = {e:d1[e] for e in s3}

另一件事,你真正需要的是用另一个字典更新一个字典,使用

d1.update(d2)