什么';计算列表中元素出现次数的python方法是什么?

什么';计算列表中元素出现次数的python方法是什么?,python,Python,这就是我所做的。python中有更好的方法吗 for k in a_list: if kvMap.has_key(k): kvMap[k]=kvMap[k]+1 else: kvMap[k]=1 对于a_列表中的k: 如果kvMap.具有_键(k): kvMap[k]=kvMap[k]+1 其他: kvMap[k]=1 谢谢单一元素: a_list.count(k) 所有要素: counts = dict((k, a_list.count(k)) for k

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

for k in a_list: if kvMap.has_key(k): kvMap[k]=kvMap[k]+1 else: kvMap[k]=1 对于a_列表中的k: 如果kvMap.具有_键(k): kvMap[k]=kvMap[k]+1 其他: kvMap[k]=1 谢谢

单一元素:

a_list.count(k)
所有要素:

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

我不知道,我觉得基本上没问题。你的代码简单易懂,这是我认为Pythic的一个重要组成部分。p> 你可以这样把它修剪一下:

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

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

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


如果您的列表已排序,另一种方法是使用。这可能不是最有效的方法,但仍然很有趣。它返回一个条目>计数:

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

这是一个老生常谈的问题,但考虑到添加到
defaultdict(int)
是一个非常常见的用法,
collections
对此有一个特殊的名称(因为Python 2.7)


这不是相当低效吗?您正在将列表转换为一个集合,对其进行迭代并为集合中的每个项目调用计数(可能是O(N))。您是对的,很可能是O(N^2),虽然我认为用一个生成器表达式代替列表理解就足够了。而且,我认为用元组代替内部列表看起来更好。我第一次遇到defaultdict是在Peter Norvig的拼写更正文章中。在几行中,他提取了一个单词文件并将其转换对于一个key=word value=count.Way cool的字典来说,外部列表理解是不必要的,一个生成器表达式就足够了。dict((key,len(list(group)),for(key,group)in itertools.groupby(l))这就是我要发布的!
>>> 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}
>>> 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})