Количество экземпляров каждого ключа в словаре 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
.