Python从列表中删除重复的字典

30

我有一个字典列表

l = [
{'firstname': 'joe', 'surname': 'bloggs'},
{'firstname': 'john', 'surname': 'smith'},
{'firstname': 'joe', 'surname': 'bloggs'},
{'firstname': 'jane', 'surname': 'bloggs'}
]

如何删除重复项,例如{'firstname': 'joe', 'surname': 'bloggs'}出现了两次,只想让它出现一次?


4
你已经尝试过什么了吗?我们不只是为了给你代码而在这里。 - Delan Azabani
实际上,我在谷歌上搜索了一些非常简单的问题,我知道可以很容易地用Python解决。而StackOverflow绝对为我的帮助提供了“只有代码”,这正是我所需要的。 - Bobort
2个回答

67

类似这样的代码应该能够完成任务:

result = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in l)]

首先,我将初始字典转换为元组列表,然后将它们放入一个集合中(这将删除重复的条目),最后再转换回字典。


4
去掉set调用中的括号--你需要使用生成器表达式,而不是列表推导式。其他方面很好。 - agf
@agf:谢谢,我得改掉这个坏习惯 ;) - Cédric Julien
1
如果我想使用10列中的两列,应该如何操作? - Naman

14
import itertools

import operator

import pprint

l = [

{'firstname': 'joe', 'surname': 'bloggs'},

{'firstname': 'john', 'surname': 'smith'},

{'firstname': 'joe', 'surname': 'bloggs'},

{'firstname': 'jane', 'surname': 'bloggs'}

]

getvals = operator.itemgetter('firstname', 'surname')

l.sort(key=getvals)

result = []

for k, g in itertools.groupby(l, getvals):
    result.append(next(g))

l[:] = result

pprint.pprint(l)

如果您有特定字段需要去重,而且不想在字典中的所有字段上进行去重,那么这是一个不错的解决方案。 - Banjer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接