2017-04-08 91 views
0

我有兩個字典的列表。python在字典的其他列表中查找字典的元素

students = [{'lastname': 'JAKUB', 'id': '92051048757', 'name': 'BAJOREK'}, 
{'lastname': 'MARIANNA', 'id': '92051861424', 'name': 'SLOTARZ'}, {'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': 
'92052877491', 'name': 'LESKO'}] 

而且

house = [{'id_pok': '2', 'id': '92051048757'}, {'id_pok': '24', 'id': '92051861424'}] 

如何找到不匹配字典的房屋列表由id存在的元素?

輸出

output = [{'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}] 

我嘗試做

for student in students: 

    for home in house: 

     if student['id'] != home['id']: 

      print student 

但這只是重複列表

+1

那你試試? –

+1

我認爲輸出將包含編號92052033215和92052877491對不對? – Hackaholic

+0

@Hackaholic yes – lukassz

回答

1

您的代碼不工作的原因是,如果有任何house_id這不匹配student_id,將打印student。你會需要一些更多的邏輯或any功能:

for student in students: 
    if not any (student['id'] == home['id'] for home in house): 
     print(student) 

它輸出:

{'lastname': 'SZYMON', 'id': '92052033215', 'name': 'WNUK'} 
{'lastname': 'WOJCIECH', 'id': '92052877491', 'name': 'LESKO'} 

更有效的解決辦法是保持house_ids的set,並找到學生的ID不包括在這個組:

students = [{'lastname': 'JAKUB', 'id': '92051048757', 'name': 'BAJOREK'}, 
{'lastname': 'MARIANNA', 'id': '92051861424', 'name': 'SLOTARZ'}, {'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': 
'92052877491', 'name': 'LESKO'}] 

house = [{'id_pok': '2', 'id': '92051048757'}, {'id_pok': '24', 'id': '92051861424'}] 

house_ids = set(house_dict['id'] for house_dict in house) 
result = [student for student in students if student['id'] not in house_ids] 

print(result)

它輸出:

[{'lastname': 'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': '92052877491', 'name': 'LESKO'}] 

請注意,2名學生符合您的描述。

setenter link description here原因是因爲它允許比列表快得多的查找。

+0

你不需要使用'set',我認爲id必須是唯一的 – Hackaholic

+0

使用set是檢查兩組數據之間對稱差異的好方法。 –

+0

@Hackaholic:我使用'set'的原因不是因爲它確保唯一的ID,而是因爲它允許快速查找。有了一張清單,它的效率會低得多。 –

0
student_ids = set(d.get('id') for d in students) 
house_ids = set(d.get('id') for d in house) 

ids_not_in_house = student_ids^house_ids 
+0

這不是所需的格式,是嗎? –

+0

我相信他可以找到一種方法把2和2放在一起 –

0
students = [{'lastname': 'JAKUB', 'id': '92051048757', 'name': 'BAJOREK'}, 
{'lastname': 'MARIANNA', 'id': '92051861424', 'name': 'SLOTARZ'}, {'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': 
'92052877491', 'name': 'LESKO'}] 

house = [{'id_pok': '2', 'id': '92051048757'}, {'id_pok': '24', 'id': '92051861424'}] 

s = {item['id'] for item in students} 
h = {item['id'] for item in house} 

not_in_house_ids = s.difference(h) 
not_in_house_items = [x for x in students if x['id'] in not_in_house_ids] 
print (not_in_house_items) 

>>>[{'name': 'WNUK', 'lastname': 'SZYMON', 'id': '92052033215'}, {'name': 'LESKO', 'lastname': 'WOJCIECH', 'id': '92052877491'}]