Элементы подсчета Python в значении dict, которое представляет собой список

Python 3.3, словарь с парами ключ-значение в этой форме.

d = {'T1': ['eggs', 'bacon', 'sausage']}

Значения представляют собой списки переменной длины, и мне нужно перебирать элементы списка. Это работает:

count = 0
for l in d.values():
   for i in l: count += 1

Но это некрасиво. Должен быть более питонический способ, но я не могу его найти.

len(d.values()) 

производит 1. Это 1 список (DUH). Попытки со счетчиком из здесь дают "нехешируемый тип" ошибки.


person RolfBly    schedule 31.05.2013    source источник


Ответы (4)


Используйте sum() и длины каждого из значений словаря:

count = sum(len(v) for v in d.itervalues())

Если вы используете Python 3, просто используйте d.values().

Быстрая демонстрация с вашим входным образцом и одним из моих:

>>> d = {'T1': ['eggs', 'bacon', 'sausage']}
>>> sum(len(v) for v in d.itervalues())
3
>>> d = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['spam', 'ham', 'monty', 'python']}
>>> sum(len(v) for v in d.itervalues())
7

Counter здесь вам не сильно поможет, вы не создаете счетчик для каждой записи, вы вычисляете общую длину всех ваших значений.

person Martijn Pieters    schedule 31.05.2013

Делая домашнее задание по Treehouse, я придумал это. Его можно упростить хотя бы на один шаг (насколько я знаю), но новичкам (таким как я) может быть проще понять эту версию.

dict = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['bread', 'butter', 'tosti']}

total = 0

for value in dict:
    value_list = dict[value]
    count = len(value_list)
    total += count

print(total)
person Rik Schoonbeek    schedule 08.06.2017

Для меня самый простой способ:

winners = {1931: ['Norman Taurog'], 1932: ['Frank Borzage'], 1933: ['Frank Lloyd'], 1934: ['Frank Capra']}

win_count_dict = {}

for k,v in winners.items():
    for winner in v:
        if winner not in win_count_dict:
            win_count_dict[winner]=1
        else:
            win_count_dict[winner]+=1


print("win_count_dict = {}".format(win_count_dict))
person Michelle Stevens    schedule 16.12.2020
comment
Вы заново изобретаете defaultdict(int) - person tripleee; 16.12.2020
comment
Я? Также спасибо за редактирование моего поста. - person Michelle Stevens; 16.12.2020
comment
Может быть потому, что вы не знали, что он существует? Стандартная библиотека предлагает компонент в модуле collections, который избавляет вас от необходимости проверять, определен ли уже ключ; документация. - person tripleee; 16.12.2020
comment
хаха вау! кажется намного проще и просто, лол, понравилось! спасибо - person Michelle Stevens; 16.12.2020

Я искал ответ на этот вопрос, когда нашел эту тему, пока не понял, что в моем коде уже есть что-то, для чего это можно использовать. Вот что я придумал:

count = 0

for key, values in dictionary.items():
        count = len(values)

Если вы хотите сохранить количество для каждого элемента словаря, вы можете создать новый словарь, чтобы сохранить количество для каждого ключа.

count = {}

for key, values in dictionary.items():
        count[key] = len(values)

Я не мог точно определить, из какой версии доступен этот метод, но я думаю, что метод .items доступен только в Python 3.

person Jeffrey    schedule 30.12.2016