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). Попытки с Counter от здесь дают ошибки "нераспакованного типа".

Ответ 1

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

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

Ответ 2

>>> d = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['spam', 'ham', 'monty', 'python']}
>>> sum(map(len, d.values()))
7

Ответ 3

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

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.

Ответ 4

Выполняя свою домашнюю работу в 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)