这就是我所做的。 Python中有更好的方法吗?什么是计算列表中元素出现的pythonic方法?
for k in a_list: if kvMap.has_key(k): kvMap[k]=kvMap[k]+1 else: kvMap[k]=1
感谢
这就是我所做的。 Python中有更好的方法吗?什么是计算列表中元素出现的pythonic方法?
for k in a_list: if kvMap.has_key(k): kvMap[k]=kvMap[k]+1 else: kvMap[k]=1
感谢
使用defaultdict
from collections import defaultdict
kvmap= defaultdict(int)
for k in a_list:
kvmap[k] += 1
单元素:
a_list.count(k)
所有元素:
counts = dict((k, a_list.count(k)) for k in set(a_list))
我不知道,它基本上看起来好像没什么问题。你的代码简单易读,这是我认为pythonic的重要组成部分。
你可以稍微修剪它,就像这样:
for k in a_list:
kvMap[k] = 1 + kvMap.get(k,0)
这就是我要发布! – hasen 2009-01-10 19:57:41
另一种解决方案利用setdefault():如果你的列表进行排序
for k in a_list:
kvMap[k] = kvMap.setdefault(k, 0) + 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}
这样一个老问题,但考虑到添加到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})
这是不是很低效?你正在将列表转换为一个集合,迭代它并调用集合中的每个元素的计数(大概是O(N)) – Dana 2009-01-09 19:59:05
你说得对,它比O(n^2)更可能,尽管我认为它的乐趣在蟒蛇排序方式 – 2009-01-10 17:12:30
生成器表达式而不是列表理解是足够的。同样,使用一个元组而不是内部列表看起来更好,我想。 – hop 2009-01-10 19:56:25