【发布时间】:2022-02-18 20:26:51
【问题描述】:
我有一个字典列表,其中包含 street、number 和 some_flag 键。
我的目标是在字典中搜索键 street 和 number 中的重复项。如果对于两个或多个字典,这两个键/值对是相同的,我想将值 1 分配给它们的 some_flag 键。
请参阅下面的可重现示例。
字典起始列表:
a = [
{'street': 'ocean drive', 'number': '1', 'some_flag': 0},
{'street': 'ocean drive', 'number': '3', 'some_flag': 0},
{'street': 'ocean drive', 'number': '4', 'some_flag': 0}, # duplicate street / number keys
{'street': 'ocean drive', 'number': '4', 'some_flag': 0}, # duplicate street / number keys
{'street': 'apple tree rd.', 'number': '3', 'some_flag': 0},
]
预期输出:
a_checked = [
{'street': 'ocean drive', 'number': '1', 'some_flag': 0},
{'street': 'ocean drive', 'number': '3', 'some_flag': 0},
{'street': 'ocean drive', 'number': '4', 'some_flag': 1}, # duplicate street / number keys
{'street': 'ocean drive', 'number': '4', 'some_flag': 1}, # duplicate street / number keys
{'street': 'apple tree rd.', 'number': '3', 'some_flag': 0},
]
我的最大努力:
到目前为止,我得到的代码来自 Aarons 的回答 (here) 和社区 wiki 的回答 (here)
from collections import defaultdict, Counter
items = defaultdict(list) # create defaultdict
for row in a:
items[row['street']].append(row['number']) # make a list of 'number' values for each 'street' key
for key in items.keys():
if checkIfDuplicates(items[key]): #if there is more than one 'number' --> function definition see below
duplicate_dict = {}
duplicate_dict['numbers'] = [item for item, count in Counter(items[key]).items() if count > 1] # storing duplicate numbers in dict
duplicate_dict['street'] = key # storing street name in same dict
检查给定列表是否包含任何重复项的功能(来自here):
def checkIfDuplicates(listOfElems):
if len(listOfElems) == len(set(listOfElems)):
return False
else:
return True
当前输出:
print(duplicate_dict)
{'numbers': ['4'], 'street': 'ocean drive'}
使用我的方法,我现在必须将duplicate_dict 与原始列表a 进行匹配,这似乎效率不高。
有没有更直接的方法来解决这个问题?
【问题讨论】:
标签: python list dictionary defaultdict