2012-03-17 77 views
2

我寻找最优雅的方式来做到以下几点:最优雅的方式在列表中算整数

比方说,我要计算时间每个整数出现在清单中的号码;我能做到这样:

x = [1,2,3,2,4,1,2,5,7,2] 

dicto = {} 

for num in x: 
    try: 
     dicto[num] = dicto[num] + 1 
    except KeyError: 
     dicto[num] = 1 

不过,我认为

try: 
    dicto[num] = dicto[num] + 1 
except KeyError: 
    dicto[num] = 1 

是不是最优雅的方式来做到这一点;我认为我看到上面的代码被一行代替。什么是最优雅的方式来做到这一点?

我意识到这可能是一个重复,但我环顾四周,找不到我在找什么。

谢谢您提前。

回答

3
>>> from collections import defaultdict 
>>> x = [1,2,3,2,4,1,2,5,7,2] 
>>> d = defaultdict(int) 
>>> for i in x: 
     d[i] += 1 

>>> dict(d) 
{1: 2, 2: 4, 3: 1, 4: 1, 5: 1, 7: 1} 

或者只是collections.Counter,如果你是在Python 2.7+以上。

8

使用Counter类

>>> from collections import Counter 
>>> x = [1,2,3,2,4,1,2,5,7,2] 
>>> c = Counter(x) 

现在你可以使用Counter对象c作为字典。

>>> c[1] 
2 
>>> c[10] 
0 

(这适用于不存在的值也是如此)

+0

这是最正确的,如果你想在'Counter'类的额外开销:当你不需要从Counter的额外开销这似乎是理想的。检查源代码,它确实支持'dict',使得散列查找和迭代性能理想。 – MrGomez 2012-03-17 22:32:51

1

Bucket sort,因为你正在做的,是完全适当的算法(discussion)。

from collections import defaultdict 

wdict = defaultdict(int) 

for word in words: 
    wdict[word] += 1 
相关问题