这是我做的。在Python中有更好的方法吗?
for k in a_list: if kvMap.__contains__(k): kvMap[k] += 1 else: kvMap[k] = 1
谢谢。
这是我做的。在Python中有更好的方法吗?
for k in a_list: if kvMap.__contains__(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)
这是一个老问题,但考虑到将值添加到 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})
另一种解决方案是利用 setdefault():
for k in a_list:
kvMap[k] = kvMap.setdefault(k, 0) + 1
>>> 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}