Подсчет элементов в списке по списку возможных значений - PullRequest
3 голосов
/ 26 января 2020

У меня есть следующий список:

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]

где возможные значения: 0,25,50,75 и 100

оттуда я хочу сгруппировать значения в словаре как:

result= {'0':0,'25':0,'50':4,'75':4,'100':1}

Я пробовал с коллекциями:

import collections
a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
counter=collections.Counter(a)

Но результат:

Counter({50: 4, 75: 4, 100: 1})

не учитывает: '0': 0, '25': 0

Как передать список опций этой или другой функции?

Ответы [ 4 ]

4 голосов
/ 26 января 2020

Для моего предложенного решения вам нужно определить список (или какой-либо другой тип итераций), который содержит все возможные ключи (в вашем случае: целые числа).

Вы можете создать новый dict , присваивая значение 0 для ключей, которые вы не найдете внутри counter. Здесь мы можем использовать симпатичное небольшое свойство collections.Counter, которое говорит (спасибо @MykolaZotko за указание на это):

Counter объекты имеют словарный интерфейс, за исключением того, что они вернуть нулевой счет для пропущенных предметов вместо того, чтобы поднимать KeyError.

Таким образом, код может быть:

import collections
possible_keys = [0, 25, 50, 75, 100]

data = [50, 75, 75, 100, 50, 50, 75, 50, 75]
counter = collections.Counter(data)

Мы можем создать новый dict с нулями для пропущенные элементы:

dict_with_zeros = {
    k: counter[k]
    for k in possible_keys}

или если вам просто нужно распечатать счетчик без фактического создания нового dict с нулями:

for k in possible_keys:
    print(k, counter[k])
4 голосов
/ 26 января 2020

Вы можете создать пустой словарь со значениями по умолчанию 0, используя dict.fromkeys(), а затем объединить его с выводом Counter():

from collections import Counter

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
possible =[0,25,50,75, 100]

{**dict.fromkeys(possible, 0), **Counter(a)}
# {0: 0, 25: 0, 50: 4, 75: 4, 100: 1}

или

d = dict.fromkeys(possible, 0)
d.update(Counter(a))
1 голос
/ 26 января 2020

Вы можете создать новый словарь с этими значениями, не прибегая к дополнительному импорту, например:

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
required = [0,25,50,75,100]

result = {item:a.count(item) for item in required}

Это словарное понимание ; он создает все ключи, присутствующие в required, и считает их вхождения, если они есть, в a. result будет содержать

{0: 0, 25: 0, 50: 4, 75: 4, 100: 1}
0 голосов
/ 26 января 2020

Я бы сделал это, используя dict -понимание следующим образом:

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
possible = [0,25,50,75,100]
result = {p:0 for p in possible}
for i in a:
    result[i] += 1
print(result)  # {0: 0, 25: 0, 50: 4, 75: 4, 100: 1}
...