2017-04-17 5 views
2

ich eine dict haben wie folgt:Iterieren durch Saiten-> string dict gibt nur das erste Zeichen für jeden

values = {'A1' : '123456', 'B1' : 123456, ....} 

Ich weiß, dass die richtige Art und Weise durchlaufen ist:

for key, value in values.items(): 
    #do what you want 

von Fehler, ich habe vergessen, .items() hinzuzufügen und so begann ich seltsam KeyError

Ich versuchte zu drucken und es wurde nur das erste Zeichen o f jeder String und Zuordnung zu key und value

Meine Frage ist: Warum macht Python das? Was passiert hinter der Szene?

+1

Weil es versucht, Sequenz Entpacken zu tun. –

+0

Es wurde versucht, "A1" und andere Schlüssel als Tupel auszupacken. Standardmäßig ist das Iterieren eines Wörterbuchs wie das Iterieren seiner Schlüssel. –

Antwort

3

Wenn Sie schreiben:

for x1,x2 in iterable: 
    # ... 

das eigentlich bedeutet, dass Sie tun Sequenz in Python Auspacken. Python wertet sie mag:

x1,x2 = key0 

Wo key0 den ersten Schlüssel (und natürlich auch andere Tasten). Dies funktioniert, wenn key0 eine iterable ist, die genau zwei Elemente hat. In diesem Fall wird das erste Element x1 und das zweite Element x2 zugewiesen.

Jetzt ist eine Zeichenfolge eine iterable, deren Elemente die Zeichen sind. Ein String 'A1' hat also zwei Elemente: 'A' und '1'. Das bedeutet, dass, wenn Sie schreiben:

key,value = 'A1' 

key'A' halten und value wird '1' halten. Jetzt, wenn Sie key drucken, wird es so den ersten Wert des Schlüssels drucken.

ein for auf einem values.items() Verwendung kein „magischer Ausdruck“: items() einfach ist eine iterable, dass 2-Tupel enthält, einen Schlüssel und den entsprechenden Wert erzeugt. Da ein Tupel auch iterierbar ist, wobei die Elemente die Elemente des Tupels sind, wird das Tupel in den Schlüssel und den Wert entpackt. Wenn Sie also schreiben: for key,value in values.items(), erzeugt der .items() eine Sequenz wie ('A1','123456'), ('B1',123456). Nun, wenn solche Tupel key,value zugewiesen wird, ist es wie das Schreiben:

key,value = ('A1','123456') 

so key das erste Element des Tupels nehmen ('A1') und value die zweite (123456).

+1

ah! Ich dachte, es würde ein Tupel entpacken ('dict_key',' dict_value'), sehe ich jetzt. Vielen Dank :) –

+0

also sagst du, wenn meine Tastenfolgen mehr als drei Zeichen hatten, wird der Code nicht funktionieren? [Ja, ich würde 'zu viele Werte zum Auspacken bekommen 'Fehler] –

+1

@ Mhd.Tahawi: in der Tat. Sie können jedoch 'for key, * value in values' schreiben. In diesem Fall sind "Werte" eine Liste, die die * verbleibenden * Elemente erfasst. –

2

Betrachten Sie es auf diese Weise:

values = {'A1' : '123', 'B1' : 456} 

for key, value in values.items(): 
    #do what you want, e.g. 
    print(key) 
    print(value) 

# result: 
# A1 
# 123 
# B1 
# 456 

, jetzt ohne .items():

values = {'A1' : '123', 'B1' : 456} 

for entry in values: 
    print(entry) 
    a,b = entry 
    #do what you want, e.g. 
    print(a) 
    print(b) 

# result: 
# A1 
# A 
# 1 
# B1 
# B 
# 1 

Wie Sie sehen können, wird das Skript jedes Wörterbuch Schlüssel zu lesen und die ersten 2 Elemente von ihm bekommen (mit Strings, die sich wie Listen verhalten).

+0

Das zweite Codefragment funktioniert nicht. Denn wenn Sie ein 'for' für' entry' machen. Sie erhalten gut die Zeichen der Schnur. Und diese können nicht weiter ausgepackt werden. –

+0

Korrigieren - Skript korrigiert. Danke – jberrio

Verwandte Themen