2015-05-13 4 views
9

zu iterieren Hinweis: Ich habe read this post and Alex Martelli's response, aber ich verstehe nicht wirklich/vollständig seine Antwort. Es ist ein bisschen jenseits meines gegenwärtigen Verständnisses. Ich würde gerne helfen, es besser zu verstehen.Verwenden von .iteritems(), um über Schlüssel, Wert im Python-Wörterbuch

Ich verstehe, dass, wenn Sie die folgende for-Schleife versuchen:

for key, value in dict: 
    print key 
    print value 

Sie erhalten:

ValueError: too many values to unpack 

Obwohl Sie Schleife über ein Wörterbuch und bekommen nur die Schlüssel mit den folgenden:

for key in dict: 
    print key 

Kann jemand eine etwas weniger erweiterte Erklärung dafür liefern, warum Sie nicht iterieren können o Ver ein Wörterbuch mit Schlüssel, Wert ohne .iteritems()?

Antwort

10

Die andere Antwort erklärt es gut. Aber hier sind einige weitere Beispiele dafür, wie es sich verhält, von Fällen zeigt, wo es tatsächlich funktioniert ohne Fehler (so kann man etwas sehen):

>>> d = {(1,2): 3, (4,5): 6} 
>>> for k, v in d: 
     print k, v 

1 2 
4 5 

Die Schleife geht durch die Tasten (1,2) und (4,5) und da diese „zufällig be "Tupel der Größe 2, können sie k und v zugeordnet werden.

Arbeiten mit Zeichenketten als auch, solange sie genau zwei Zeichen:

>>> d = {"AB":3, "CD":6} 
>>> for k, v in d: 
     print k, v 

A B 
C D 

Ich nehme an, es in Ihrem Fall so etwas wie das war?

>>> d = {"ABC":3, "CD":6} 
>>> for k, v in d: 
     print k, v 

Traceback (most recent call last): 
    File "<pyshell#42>", line 1, in <module> 
    for k, v in d: 
ValueError: too many values to unpack 

Hier ist der Schlüssel „ABC“ ist eine dreifache und damit klagt Python zu versuchen, es in nur zwei Variablen zu entpacken.

+1

Während dies korrekt ist, ist es nicht wirklich hilfreich für das OP, angesichts der Kontext der Frage. –

+2

Ich hoffe, es ** ist ** hilfreich, indem ich das Verhalten mit einigen Beispielen illustriere, besonders einer, der tatsächlich zu dem empfangenen 'ValueError' führt. Ich füge mehr zu meiner Antwort für dieses ... hinzu –

+0

@DougR. Wie ist es jetzt? –

6

Python hat eine Funktion namens iterable entpacken. Wenn Sie das tun

a, b = thing 

Python übernimmt thing ein Tupel oder Liste oder etwas mit 2 Einträgen, und es ordnet die ersten und zweiten Elemente a und b. Dies funktioniert auch in einer for Schleife:

for a, b in thing: 

entspricht

for c in thing: 
    a, b = c 

außer es nicht, dass c Variable nicht erstellen.

Dies bedeutet, dass wenn Sie das tun

for k, v in d: 

Python kann die Tatsache nicht aus, dass Sie k, v statt k gesagt haben und Sie Elemente statt Schlüssel geben, weil vielleicht die Schlüssel 2-Tupel . Es muss über die Schlüssel iterieren und versuchen, jeden Schlüssel in die Variablen k und v zu entpacken.

0

Während Sie for xx in XX verwenden, verwenden Sie tatsächlich einen Iterator, um XX zu iterieren, und XX muss iterierbar sein. Sie können iter Funktion verwenden, um einen Iterator zu bekommen, da

>>> d = dict(a=1,b=2) 
>>> i = iter(d) 
>>> i 
<dictionary-keyiterator object at 0x6ffff8739f0> 

und next unter Verwendung der Elemente zuzugreifen.

>>> next(i) 
'a' 

So in jeder Iteration von for k in d wird k-next(i) zugeordnet werden, und es ist nur der Schlüssel ohne Wert. beispielsweise in der ersten Runde der Iteration

k = 'a' 

Während .iteritems() wird ein weiteren Iterator Rückkehr mit einem Tupel von Schlüssel-Wert-Kombination erhalten. Lassen Sie uns dies überprüfen

>>> i = d.iteritems() 
>>> i 
<dictionary-itemiterator object at 0x6ffff873998> 
>>> next(i) 
('a', 1) 

Siehe? In der ersten Runde der for k, v in d.iteritems() wir diesen Auftrag tatsächlich erhalten

k, v = ('a', 1) 

Wenn Sie also for k, v in d verwenden, werden Sie

k, v = 'a' 

Das ist eine illegale Zuordnung erhalten.

0

In Python 2.7.6 möchten Sie möglicherweise nach Untereigenschaften des Wörterbuchs mit dict.has_key(property_name) suchen.

Verwandte Themen