2011-11-23 52 views
3

我如何在此列表中找到重复计数。在django python中计算字典列表中的重复项

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

是否有无论如何在查询中找到?或通过其他方式?

谢谢!

回答

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

它可能不用说,重复与数比一个:-)更大的条目

+0

'Counter'不是在Python 2.6 – Ahsan

+5

我知道。我写道:-)好消息是我也写了一个backport。有关在Python 2.5或更高版本上运行的版本,请参阅http://code.activestate.com/recipes/577664-counter-class/。附:在发布Python问题时,请务必提及您使用的是2.6;否则,受访者会认为你已经拥有当前版本的Python。 –

+0

我不断地惊叹于我遇到的高调人物的数量,我们应该这么说:) –