什么是计算列表中元素出现的pythonic方法?

时间:2009-01-09 19:42:33

标签: python

这就是我所做的。在python中有更好的方法吗?

for k in a_list:   
  if kvMap.has_key(k):
    kvMap[k]=kvMap[k]+1   
  else:
    kvMap[k]=1

由于

6 个答案:

答案 0 :(得分:15)

使用defaultdict

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

答案 1 :(得分:9)

单个元素:

a_list.count(k)

所有元素:

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

答案 2 :(得分:7)

我不知道,它基本上对我来说很好。您的代码简单易读,这是我认为pythonic的重要组成部分。

你可以这样修剪它:

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

答案 3 :(得分:4)

这么老的问题,但考虑到添加到defaultdict(int)这是一个常见的用途,collections有一个特殊的名称(因为Python 2.7)<毫不奇怪p>

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

答案 4 :(得分:3)

另一个解决方案利用了setdefault():

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

答案 5 :(得分:1)

如果您的列表已排序,则另一种方法是使用itertools.groupby。这可能不是最有效的方法,但它仍然很有趣。它返回项目的字典&gt;数:

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