2017-04-08 93 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'}]