假设我有一个字典列表:
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
如何获得唯一字典的列表(删除重复项)?
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
由于id足以检测重复项,且id是可哈希的:在以id为键的字典中运行它们。每个键的值都是原始字典。
deduped_dicts = dict((item["id"], item) for item in list_of_dicts).values()
在Python 3中,values()不返回列表;你需要在list()中包装整个表达式的右边,并且你可以将表达式的部分更经济地写成dict理解:
deduped_dicts = list({item["id"]: item for item in list_of_dicts}.values())
注意,结果可能与原始结果的顺序不同。如果这是一个要求,您可以使用集合。OrderedDict而不是dict。
顺便说一句,将数据保存在使用id作为键的字典中可能很有意义。
我不知道你是否只希望列表中dicts的id是唯一的,但如果目标是有一组dict,其中所有键的值都是唯一的。你应该像这样使用元组键:
>>> L=[
... {'id':1,'name':'john', 'age':34},
... {'id':1,'name':'john', 'age':34},
... {'id':2,'name':'hanna', 'age':30},
... {'id':2,'name':'hanna', 'age':50}
... ]
>>> len(L)
4
>>> L=list({(v['id'], v['age'], v['name']):v for v in L}.values())
>>>L
[{'id': 1, 'name': 'john', 'age': 34}, {'id': 2, 'name': 'hanna', 'age': 30}, {'id': 2, 'name': 'hanna', 'age': 50}]
>>>len(L)
3
希望它能帮助你或其他有顾虑的人....
由于id足以检测重复项,且id是可哈希的:在以id为键的字典中运行它们。每个键的值都是原始字典。
deduped_dicts = dict((item["id"], item) for item in list_of_dicts).values()
在Python 3中,values()不返回列表;你需要在list()中包装整个表达式的右边,并且你可以将表达式的部分更经济地写成dict理解:
deduped_dicts = list({item["id"]: item for item in list_of_dicts}.values())
注意,结果可能与原始结果的顺序不同。如果这是一个要求,您可以使用集合。OrderedDict而不是dict。
顺便说一句,将数据保存在使用id作为键的字典中可能很有意义。
非常简单的选择:
L = [
{'id':1,'name':'john', 'age':34},
{'id':1,'name':'john', 'age':34},
{'id':2,'name':'hanna', 'age':30},
]
D = dict()
for l in L: D[l['id']] = l
output = list(D.values())
print output