2010-03-06 88 views
3

有没有办法查看字典中有多少项共享Python中的相同值?字典中有多少项共享Python中的相同值

比方说,我有一个像一本字典:

{"a": 600, "b": 75, "c": 75, "d": 90} 

我想获得一个导致词典,如:

{600: 1, 75: 2, 90: 1} 

我第一次尝试幼稚将只使用一个nested- for循环和每个值,然后我会再次遍历字典。有一个更好的方法吗?

回答

6

您可以为此使用itertools.groupby。

import itertools 
x = {"a": 600, "b": 75, "c": 75, "d": 90} 
[(k, len(list(v))) for k, v in itertools.groupby(sorted(x.values()))] 
+0

为我工作!谢谢WoLpH,但我不得不调整它来使用字典,而不是:{k:len(list(v))for k,v in itertools.groupby(x.values())} – Jared 2010-03-06 20:04:35

+4

在一般情况下不起作用没有**排序**这些值!例如。与“排序”的Python内置函数。 – 2010-03-06 23:21:32

1
>>> a = {"a": 600, "b": 75, "c": 75, "d": 90} 
>>> b = {} 
>>> for k,v in a.iteritems(): 
...  b[v] = b.get(v,0) + 1 
... 
>>> b 
{600: 1, 90: 1, 75: 2} 
>>> 
0

使用Counter(2.7+,请参阅下面的链接了解老版本的实现)与dict.values()一起。

2

当Python 2.7出来,你可以使用它的collections.Counter class

否则看到counter receipe

在Python的2.7a3

from collections import Counter 
items = {"a": 600, "b": 75, "c": 75, "d": 90}  
c = Counter(items) 

print( dict(c.items())) 

输出

{600:1,90 :1,75:2}

+0

py 3.1已经不存在了,并且不需要每天几次重新发布完全相同的答案。 – SilentGhost 2010-03-06 20:10:35

+1

@SilentGhost,Py 3.1已经出来了,但是2.7不是(仍然是alpha) - 只要人们提出显然需要Counter的问题,将它指向它是完全正确的! – 2010-03-06 23:20:44

+1

@Alex:它是一个副本的副本,它有同一用户在每个线程中给出的重复答案。而不是乘法实体,最好完全解决问题。 – SilentGhost 2010-03-06 23:43:12

0
>>> a = {"a": 600, "b": 75, "c": 75, "d": 90} 
>>> d={} 
>>> for v in a.values(): 
... if not v in d: d[v]=1 
... else: d[v]+=1 
... 
>>> d 
{600: 1, 90: 1, 75: 2}