2013-05-31 15 views
10

Python 3.3, słownik z parami klucz-wartość w tym formularzu.Python liczy elementy w wartości dyktowanej, która jest listą

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

Wartości są listami o zmiennej długości i potrzebuję do iteracji po elementach listy. To działa:

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

Ale to jest brzydkie. Musi być bardziej Pythonicznie, ale nie mogę tego znaleźć.

len(d.values()) 

produkuje 1. Jest to 1 lista (DUH). Próby z licznikiem od here dają błędy typu "nieodmiennego typu".

Odpowiedz

35

Zastosowanie sum() i długości każdego z wartościami słownika:

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

Jeśli używasz Python 3, a następnie po prostu użyć d.values().

Szybkie demo z próby wejścia i jedno z kopalni:

>>> 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 nie pomoże dużo tutaj, nie tworzysz licznik za wejściem, jesteś obliczaniu całkowitej długości wszystkich swoich wartości.

+0

Dzięki! Bardzo pomocna, jak zwykle :) – RolfBly

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

Szukałem odpowiedzi na to, gdy znalazłem ten temat, dopóki nie zdałem sobie sprawy, że mam już coś w moim kodzie, aby go użyć. To właśnie wymyśliłem:

count = 0 

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

Jeśli chcesz zapisać licznik dla każdego słowniku pozycji można utworzyć nowy słownik, aby zapisać liczbę dla każdego klawisza.

count = {} 

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

nie mogę dokładnie znaleźć, z których wersja ta metoda jest dostępna, ale myślę, że metoda .items jest dostępna tylko w Pythonie 3.

0

odrabiam lekcje na Treehouse wpadłem na to. Można go uprościć o co najmniej jeden krok (o którym wiem), ale początkującym (takim jak ja) może być łatwiejsze opanowanie tej wersji.

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)