2010-05-04 17 views
21

następujących utworów zgodnie z oczekiwaniami:Iteracja na klucz i wartość słowników defaultdict

d = [(1,2), (3,4)] 
for k,v in d: 
    print "%s - %s" % (str(k), str(v)) 

Ale to się nie powiedzie:

d = collections.defaultdict(int) 
d[1] = 2 
d[3] = 4 
for k,v in d: 
    print "%s - %s" % (str(k), str(v)) 

Z:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not iterable 

Dlaczego? Jak mogę to naprawić?

+0

Co dokładnie próbujesz osiągnąć? W jakim kontekście to robisz? – dlamotte

+1

Twoje dwa przykłady nie są w ogóle porównywalne. Jedna to lista, druga to słownik? O co pytasz? –

+0

Tak, przeoczyłem, że pierwsza była lista;) –

Odpowiedz

48

trzeba iteracyjne nad dict.iteritems():

for k,v in d.iteritems():    # will become d.items() in py3k 
    print "%s - %s" % (str(k), str(v)) 
+0

Dzięki. Dlaczego jednak działa z niejawnie utworzonym słownikiem? Czy są to niespójności/różnice w implementacji? –

+9

@ gf Twój pierwszy przykład to lista, a nie słownik. –

+2

@Daniel: Ouch, dzięki :) –

6

jeśli używasz Pythona 3.6

from collections import defaultdict 

for k, v in d.items(): 
    print(f'{k} - {v}') 
Powiązane problemy