2009-01-09 65 views

回答

14

使用defaultdict

from collections import defaultdict 
kvmap= defaultdict(int) 
for k in a_list: 
    kvmap[k] += 1 
9

单元素:

a_list.count(k) 

所有元素:

counts = dict((k, a_list.count(k)) for k in set(a_list)) 
+0

这是不是很低效?你正在将列表转换为一个集合,迭代它并调用集合中的每个元素的计数(大概是O(N)) – Dana 2009-01-09 19:59:05

+0

你说得对,它比O(n^2)更可能,尽管我认为它的乐趣在蟒蛇排序方式 – 2009-01-10 17:12:30

+0

生成器表达式而不是列表理解是足够的。同样,使用一个元组而不是内部列表看起来更好,我想。 – hop 2009-01-10 19:56:25

7

我不知道,它基本上看起来好像没什么问题。你的代码简单易读,这是我认为pythonic的重要组成部分。

你可以稍微修剪它,就像这样:

for k in a_list: 
    kvMap[k] = 1 + kvMap.get(k,0) 
+0

这就是我要发布! – hasen 2009-01-10 19:57:41

3

另一种解决方案利用setdefault():如果你的列表进行排序

for k in a_list: 
    kvMap[k] = kvMap.setdefault(k, 0) + 1 
1

,另一种方法是使用itertools.groupby。这可能不是最有效的方式,但它很有趣。它retuns项目的字典>数:

>>> import itertools 
>>> l = [1,1,2,3,4,4,4,5,5,6,6,6,7] 
>>> dict([(key, len([e for e in group])) 
      for (key, group) 
      in itertools.groupby(l)]) 
{1: 2, 2: 1, 3: 1, 4: 3, 5: 2, 6: 3, 7: 1} 
4

这样一个老问题,但考虑到添加到defaultdict(int)是这样一个共同的使用,它应该是毫不奇怪,collections有一个特殊的名字(因为Python 2.7)

>>> from collections import Counter 
>>> Counter([1, 2, 1, 1, 3, 2, 3, 4]) 
Counter({1: 3, 2: 2, 3: 2, 4: 1}) 
>>> Counter("banana") 
Counter({'a': 3, 'n': 2, 'b': 1}) 
相关问题