统计 Python 字典中每个键出现的次数

23

我有一个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"}]

现在针对每个“sign”键,我想计算每个值出现的次数。

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

然而,这会打印出字典中“sign”出现的次数,而不是获取sign的值并计算特定值出现的次数。

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

Aquarius: 2
Sagittarius: 2
Gemini: 1
...

等等。为了得到所需的输出,我应该改变什么?


您希望结果以任何特定顺序呈现吗? - thefourtheye
@thefourtheye,不用了。任何顺序都可以。下面的两个答案很快就解决了问题。 :) - Newtt
1
另外,你有一个Python字典列表 :-) - thefourtheye
3个回答

23

使用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)

10

您可以使用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}) 
这将给您一个字典,其中 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}

dictionary.get方法有一个可选的第二个参数,如果在字典中没有找到对应的键,则返回该参数设定的默认值。所以,如果当前符号不在result中,它将返回0


0
def counter(my_list):
    my_list = sorted(my_list)
    first_val, *all_val = my_list
    p_index = my_list.index(first_val)
    my_counter = {}
    for item in all_val:
         c_index = my_list.index(item)
         diff = abs(c_index-p_index)
         p_index = c_index
         my_counter[first_val] = diff 
         first_val = item
    c_index = my_list.index(item)
    diff = len(my_list) - c_index
    my_counter[first_val] = diff 
    return my_counter

>>> counter([list(i.values())[1] for i in my_list])
{'Aquarius': 2,
 'Capricorn': 2,
 'Gemini': 1,
 'Leo': 2,
 'Sagittarius': 2,
 'Scorpio': 1}

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