在 Django Python 中,统计字典列表中的重复项

3
如何在此列表中找到重复项的数量。
>>> result = SiteTags.objects.values('content_type','object_id')
>>> result
[{'object_id': 1, 'content_type': 46}, {'object_id': 1, 'content_type': 46}, {'object_id': 2, 'content_type': 42}]

有没有办法在查询中查找?或通过其他方式?

谢谢!

2个回答

6
如果我正确理解您的请求,那么 collections.Counter 应该是一种有用的计算重复元素的方法。它仅适用于可哈希的输入,所以您列表中的字典需要转换为排序后的元组:
>>> from collections import Counter
>>> Counter([tuple(sorted(d.items())) for d in result])
Counter({(('content_type', 46), ('object_id', 1)): 2, (('content_type', 42), ('object_id', 2)): 1})

很可能不用说,重复项是计数大于一的条目 :-)

Counter 不支持 Python 2.6。 - Ahsan
5
我知道。我写过它 :-) 好消息是我还写了一个回溯版本。请参见http://code.activestate.com/recipes/577664-counter-class/,这个版本可以在Python 2.5或更高版本上运行。P.S. 发布Python问题时,请确保提到你正在使用的是2.6版本;否则,回答者会假定你有最新版本的Python。 - Raymond Hettinger
我对在SO上遇到的那些,咳咳,高知名度人物的数量感到不可思议 :) - Karl Knechtel

3
set(tuple(sorted(r.iteritems())) for r in result)

给你一个列表中的一组唯一元素。获取它的长度并将其与len(result)进行比较。

要获取结果中每个元素及其计数:

counter = {}
for r in result:
    tup = tuple(sorted(r.iteritems()))
    counter[tup] = counter.get(tup, 0) + 1
for tup, cnt in counter.iteritems():
    print dict(tup), cnt

输出:

{'object_id': 2, 'content_type': 42} 1
{'object_id': 1, 'content_type': 46} 2

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