计算python字典中每个键的出现次数

New*_*wtt 14 python dictionary python-2.7

我有一个python字典对象,看起来有点像这样:

[{"house": 4,  "sign": "Aquarius"},
 {"house": 2,  "sign": "Sagittarius"},
 {"house": 8,  "sign": "Gemini"},
 {"house": 3,  "sign": "Capricorn"},
 {"house": 2,  "sign": "Sagittarius"},
 {"house": 3,  "sign": "Capricorn"},
 {"house": 10, "sign": "Leo"},
 {"house": 4,  "sign": "Aquarius"},
 {"house": 10, "sign": "Leo"},
 {"house": 1,  "sign": "Scorpio"}]
Run Code Online (Sandbox Code Playgroud)

现在对于每个'符号'键,我想计算每个值出现的次数.

def predominant_sign(data):
    signs = [k['sign'] for k in data if k.get('sign')]
    print len(signs)
Run Code Online (Sandbox Code Playgroud)

但是,这会打印字典中出现'符号'的次数,而不是获取该值sign并计算特定值出现的次数.

例如,我想看到的输出是:

Aquarius: 2
Sagittarius: 2
Gemini: 1
...
Run Code Online (Sandbox Code Playgroud)

等等.我应该改变什么来获得所需的输出?

vau*_*tah 15

用法collections.Counter及其most_common方法:

from collections import Counter
def predominant_sign(data):
    signs = Counter(k['sign'] for k in data if k.get('sign'))
    for sign, count in signs.most_common():
        print(sign, count)
Run Code Online (Sandbox Code Playgroud)


the*_*eye 8

您可以使用collections.Counter带有简单生成器表达式的模块,如下所示

>>> from collections import Counter
>>> Counter(k['sign'] for k in data if k.get('sign'))
Counter({'Sagittarius': 2, 'Capricorn': 2, 'Aquarius': 2, 'Leo': 2, 'Scorpio': 1, 'Gemini': 1}) 
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个字典,其中包含signs作为键及其出现次数作为值。


你可以用普通的字典做同样的事情,像这样

>>> result = {}
>>> for k in data:
...     if 'sign' in k:
...         result[k['sign']] = result.get(k['sign'], 0) + 1
>>> result
{'Sagittarius': 2, 'Capricorn': 2, 'Aquarius': 2, 'Leo': 2, 'Scorpio': 1, 'Gemini': 1}
Run Code Online (Sandbox Code Playgroud)

dictionary.get方法接受第二个参数,如果在字典中找不到该键,该参数将是要返回的默认值。因此,如果当前符号不在 中result,它将0改为给出。