python在字典的其他列表中查找字典的元素
我有两个字典的列表。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
但这只是重复列表
您的代码不工作的原因是,如果有任何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名学生符合您的描述。
set
enter link description here原因是因为它允许比列表快得多的查找。
你不需要使用'set',我认为id必须是唯一的 – Hackaholic
使用set是检查两组数据之间对称差异的好方法。 –
@Hackaholic:我使用'set'的原因不是因为它确保唯一的ID,而是因为它允许快速查找。有了一张清单,它的效率会低得多。 –
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
这不是所需的格式,是吗? –
我相信他可以找到一种方法把2和2放在一起 –
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'}]
那你试试? –
我认为输出将包含编号92052033215和92052877491对不对? – Hackaholic
@Hackaholic yes – lukassz