1

我使用 setdefault 来计算这样的实例(这是精简版):

user_to_count_map = {}
for username in list_of_usernames:
    x = user_to_count_map.setdefault(username, 0)
    x += 1
    user_to_count_map[username] = x + 1
for username in sorted(usernmae_to_count_map):
    print username, user_to_count_map[username]

我不喜欢分配回地图,因为真正的代码更复杂,有多个计数增加。但我似乎确实需要这样做。有没有简单的方法解决这个问题?

4

3 回答 3

5

要计算元素,您应该使用Counter

import collections
user_counts = collections.Counter(list_of_usernames)
print(user_counts.most_common())

或者, a 的get方法与的方法dict相同setdefault,但没有将值存储在 dict 中的副作用:

user_to_count_map = {}
for username in list_of_usernames:
    user_to_count_map[username] = user_to_count_map.get(username, 0) + 1
于 2012-05-28T10:13:16.580 回答
1

您可以使计数器成为一个包含一个元素的列表,从而有效地使其成为可变的:

user_to_count_map = {}
for username in list_of_usernames:
    x = user_to_count_map.setdefault(username, [0])
    x[0] += 1
for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]

我不确定这是否会使您的代码更具可读性,因为显式优于隐式。

或者,如果使用 python 2.7 或更新版本(或使用方便的 backport),您可以使用Counterobject

from collections import Counter
user_to_count_map = Counter()
for username in list_of_usernames:
    user_to_count_map[username] += 1
for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]        

请注意,通过使用 aCounter您有一个字典会自动为您提供默认值 0。否则它就像一个保存整数值的字典,因此您可以以任何您喜欢的方式递增和递减这些值(包括添加超过 1)。

使用 , 也可以在 collections 模块中获得相同的效果defaultdict,但请注意Counter该类提供了功能。defaultdict存在于 python 2.5 及更高版本中;例子:

from collections import defaultdict
user_to_count_map = defaultdict(lambda: 0)
for username in list_of_usernames:
    user_to_count_map[username] += 1

或者,您可以完全放弃 setdefault ,因为无论如何您总是分配回映射:

user_to_count_map = {}
for username in list_of_usernames:
    x = user_to_count_map.get(username, 0)
    x += 1
    user_to_count_map[x] = x
for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]
于 2012-05-28T10:15:55.790 回答
0

如果你不喜欢 setdefault 并且总是从 0 开始,你可以这样做:

from collections import defaultdict

user_to_count_map = defaultdict(lambda: [0])
for username in list_of_usernames:
    # no set_default
    user_to_count_map[username][0] += value

for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]
于 2012-05-28T14:41:45.233 回答