在一个集合中计算多个重复出现的次数

12
if group not in g:
    g[group] = set()
g[group].add(name)

遍历具有以下结构的群组列表:

Group: A
Name: Bob

并将属于特定组的人的姓名添加到集合中。集合中的名称是唯一的,我们不知道一个组中有多少个相似的名称。例如,如果有两个“Bob”名称或5个“Mike”名称,我该如何计算名称的多次出现,以获得类似以下内容的结果:

Group A: Bob 2, Mike 5
Group B: Jane 4

等等,提前感谢。

3个回答

53

看起来你最好使用一个Counter

>>> from collections import Counter
>>> mylist = ["Bob", "Mike", "Bob", "Mike", "Mike", "Mike", "Bob"]
>>> Counter(mylist)
Counter({'Mike': 4, 'Bob': 3})

2
在版本小于2.7的情况下,您可以使用http://code.activestate.com/recipes/576611-counter-class/。 - TryPyPy
我在一个有6000万行的pandas数据框上尝试了这个方法,使用并行处理效果非常好。 - devssh
@TryPyPy,我认为你反了。计数器类在所有大于等于2.7的版本中都可用;我刚在Python3.7中使用了其中一些方法,没有问题。 - jeremysprofile

5
使用字典的嵌套来进行计数,例如如下所示:
tralala = dict()

for group, name in [('A', 'Bob'), ('B', 'Jane'), ('A', 'Bob')]:
    tralala.setdefault(group, dict()).setdefault(name, 0) 
    tralala[group][name] += 1

print tralala

这会导致...
{'A': {'Bob': 2}, 'B': {'Jane': 1}}

-3


from collections import Counter, defaultdict

lst = [('B', 'Bob'), ('A', 'Andy'), ('C', 'Charles'), ('A', 'Adam'), ('B', 'Abraham')]
# 假设人们可以出现在多个组中 def groups(lst): counter = Counter(lst) result = defaultdict(dict) for (group, name), value in counter.iteritems(): result[group][name] = value return result


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接