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

3 投票
2 回答
596 浏览
提问于 2025-04-17 06:53

我该怎么找出这个列表中重复项的数量呢?

>>> 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})

这可能不用多说,重复的项就是那些出现次数大于一的条目 :-)

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

撰写回答