2014-04-12 27 views
-4

我有字典的兩份名單路口字典的兩個列表 - Python的

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

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

即我想根據「ID」字段找到交集(基於任何一個字段,假設列表中的常見項目完全相同)。建議我一些有效的Python的方式...

如何像

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

什麼宜如果'id'是相同的,但'key1'不同,那麼'key1'的值是多少? –

+0

我認爲這兩個列表中提到的值完全相同,仍然更新了我的問題 - 現在我想更好。 – Nish

回答

4

爲什麼不使用列表理解:

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

你可以只用一個簡單的過濾

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

假設您想保留從listA字典當一個可能與"id"相同的不同字典值爲listB

+0

我的方法呢? - 見編輯的問題。您正在遍歷完整的listB標識符。 – Nish

+0

@Nish:我已經從'listB'中的id創建了一個集合,所以列表理解中使用的'in'是O(1)。這兩個列表中的每一個都被完整地迭代一次,並且唯一不需要的情況是其中一個列表爲空。你的例子還在迭代兩個完整列表(當構建集合時),然後在交集上進行另一次迭代。 – 6502

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)