0

所以我有一本字典

d = {'a': [4,'Adam', 2, ‘Bob’, 3], 'b': [3,'John', 4, ‘Bill’], 'c': [4,'Adam', 3, 4, ‘John’], 'd': [4,'Bill', ‘Joe’, 3], 'e': [4,'Bob', ‘Bob’, 5, 8, 10], 'f': [4, 'Joe'], 'g': [4, 'Bill', 4, ‘Joe’, 1]}

我想从中返回名称的计数,例如

Adam: 2
Bill: 3
John: 2
Bob: 3
Joe: 3

我尝试通过此功能使用集合计数器:

x = 0
for vals in d.itervalues(): 
    while x<len(vals):           
        if type(vals[x]) == str:
            print Counter([vals[x]])
        x = x+1 

哪个返回

Counter({'Adam': 1})
Counter({'Bob': 1})
Counter({'Adam': 1})
Counter({'John': 1})
Counter({'John': 1})
Counter({'Bill': 1})
Counter({'Bob': 1})
Counter({'Bob': 1})
Counter({'Bill': 1})
Counter({'Joe': 1})
Counter({'Bill': 1})
Counter({'Joe': 1})
Counter({'Joe': 1})

但这不是我想要的结果。我只需要添加计数器吗?我该怎么做?我知道计数器类有一个加/减函数,但我尝试的方法不起作用。

我也尝试过这样的方法来为每个变体打印出不同的计数器。

'c%s'%(x)

这将为每个计数器设置 c1、c2、c3,然后我可以将它们与 c1 + c2 + c3 相加以获得我想要的结果。但是,我无法将这些不同的计数器列表打印出来。

除此之外,一旦它确实返回结果,它总是返回“Counter({ _ _})”。我将如何删除该部分或仅打印名称并单独计数?

谢谢您的帮助!

4

1 回答 1

6

您正在为要计数的每个项目创建一个新Counter实例,您需要一个实例来计算所有项目:

from collections import Counter
counter = Counter(s for v in d.itervalues() for s in v if isinstance(s, str))

这导致

Counter({'Bob': 3, 'Bill': 3, 'Joe': 3, 'John': 2, 'Adam': 2})

请注意,如果可能,您通常应该避免出现在字典值中的那种异构列表。

于 2012-08-02T15:52:44.963 回答