我正在努力改变:
[{'text': 'hallo world', 'num': 1},
{'text': 'hallo world', 'num': 2},
{'text': 'hallo world', 'num': 1},
{'text': 'haltlo world', 'num': 1},
{'text': 'hallo world', 'num': 1},
{'text': 'hallo world', 'num': 1},
{'text': 'hallo world', 'num': 1}]
到一个没有重复的字典列表和一个重复的计数:
[{'text': 'hallo world', 'num': 2, 'count':1},
{'text': 'hallo world', 'num': 1, 'count':5},
{'text': 'haltlo world', 'num': 1, 'count':1}]
到目前为止,我有以下内容来查找重复项:
result = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in li)]
然后它返回:
[{'text': 'hallo world', 'num': 2},
{'text': 'hallo world', 'num': 1},
{'text': 'haltlo world', 'num': 1}]
谢谢!
答案 0 :(得分:5)
注意:现在使用frozenset
,这意味着字典中的项目必须是可清除的。
>>> from collections import defaultdict
>>> from itertools import chain
>>> data = [{'text': 'hallo world', 'num': 1}, {'text': 'hallo world', 'num': 2}, {'text': 'hallo world', 'num': 1}, {'text': 'haltlo world', 'num': 1}, {'text': 'hallo world', 'num': 1}, {'text': 'hallo world', 'num': 1}, {'text': 'hallo world', 'num': 1}]
>>> c = defaultdict(int)
>>> for d in data:
c[frozenset(d.iteritems())] += 1
>>> [dict(chain(k, (('count', count),))) for k, count in c.iteritems()]
[{'count': 1, 'text': 'haltlo world', 'num': 1}, {'count': 1, 'text': 'hallo world', 'num': 2}, {'count': 5, 'text': 'hallo world', 'num': 1}]
答案 1 :(得分:4)
我会使用itertools
中我最喜欢的一个:
from itertools import groupby
def canonicalize_dict(x):
"Return a (key, value) list sorted by the hash of the key"
return sorted(x.items(), key=lambda x: hash(x[0]))
def unique_and_count(lst):
"Return a list of unique dicts with a 'count' key added"
grouper = groupby(sorted(map(canonicalize_dict, lst)))
return [dict(k + [("count", len(list(g)))]) for k, g in grouper]
a = [{'text': 'hallo world', 'num': 1},
#....
{'text': 'hallo world', 'num': 1}]
print unique_and_count(a)
输出
[{'count': 5, 'text': 'hallo world', 'num': 1},
{'count': 1, 'text': 'hallo world', 'num': 2},
{'count': 1, 'text': 'haltlo world', 'num': 1}]
正如gnibbler指出的那样,d1.items()
和d2.items()
可能有不同的键排序even if the keys are identical,所以我引入了canonical_dict
函数来解决这个问题。< / p>
答案 2 :(得分:0)
想要简单的解决方案,而无需使用任何内置函数,
>>> d = [{'text': 'hallo world', 'num': 1},
... {'text': 'hallo world', 'num': 2},
... {'text': 'hallo world', 'num': 1},
... {'text': 'haltlo world', 'num': 1},
... {'text': 'hallo world', 'num': 1},
... {'text': 'hallo world', 'num': 1},
... {'text': 'hallo world', 'num': 1}]
>>>
>>> def unique_counter(filesets):
... for i in filesets:
... i['count'] = sum([1 for j in filesets if j['num'] == i['num']])
... return {k['num']:k for k in filesets}.values()
...
>>> unique_counter(d)
[{'count': 6, 'text': 'hallo world', 'num': 1}, {'count': 1, 'text': 'hallo world', 'num': 2}]