Количество экземпляров каждого ключа в словаре python

У меня есть словарь-словарь 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"}]

Теперь для каждого знака "знак" я хотел бы подсчитать, сколько раз происходит каждое значение.

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

Это, однако, печатает количество раз "знак" появляется в словаре, вместо получения значения sign и подсчета количества раз, когда появляется определенное значение.

Например, вывод, который я хотел бы увидеть, следующий:

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

И так далее. Что я должен изменить, чтобы получить желаемый результат?

Ответ 1

Используйте 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)

Ответ 2

Вы можете использовать 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 as и их количество вхождений как значения.


Вы можете сделать то же самое с обычным словарем, например,

>>> 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.