Vraag Itereren over woordenboeken met behulp van 'for' loops


Ik ben een beetje verbaasd over de volgende code:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Wat ik niet begrijp is het key deel. Hoe herkent Python dat het alleen de sleutel uit het woordenboek hoeft te lezen? is key een speciaal woord in Python? Of is het gewoon een variabele?


2105
2017-07-20 22:27


oorsprong


antwoorden:


key is gewoon een variabele naam.

for key in d:

zal eenvoudigweg de toetsen in het woordenboek omcirkelen in plaats van de toetsen en waarden. Als u zowel de sleutel als de waarde wilt herhalen, kunt u het volgende gebruiken:

Voor Python 2.x:

for key, value in d.iteritems():

Voor Python 3.x:

for key, value in d.items():

Om het voor jezelf te testen, verander je het woord key naar poop.

Voor Python 3.x, iteritems() is vervangen door gewoon items(), wat een setachtige weergave oplevert die door het dictaat wordt ondersteund, zoals iteritems() maar nog beter. Dit is ook beschikbaar in 2.7 als viewitems().

De operatie items() zal werken voor zowel 2 als 3, maar in 2 zal het een lijst van de woordenboeken retourneren (key, value) paren, die geen veranderingen in het dictaat weergeven die na de items() noemen. Als u het 2.x-gedrag in 3.x wilt, kunt u bellen list(d.items()).


3784
2017-07-20 22:29



Het is niet dat de sleutel een speciaal woord is, maar dat woordenboeken het iterator-protocol implementeren. Je zou dit in je klas kunnen doen, bijvoorbeeld zien deze vraag voor het bouwen van class iterators.

In het geval van woordenboeken is het geïmplementeerd op C-niveau. De details zijn beschikbaar in PEP 234. In het bijzonder, de sectie met de titel "Dictionary Iterators":

  • Woordenboeken implementeren een tp_iter-slot dat efficiënt is   iterator die itereert over de toetsen van het woordenboek. [...] Deze   betekent dat we kunnen schrijven

    for k in dict: ...
    

    wat gelijk is aan, maar veel sneller dan

    for k in dict.keys(): ...
    

    zo lang als de beperking op wijzigingen in het woordenboek   (hetzij door de lus of door een andere thread) worden niet overtreden.

  • Methoden toevoegen aan woordenboeken die verschillende soorten retourneren   iterators expliciet:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Dit betekent dat for x in dict is steno voor for x in dict.iterkeys().


325
2017-07-20 23:52



Itereren over een dict itereert via de toetsen in willekeurige volgorde, zoals je hier kunt zien:

Bewerken: (Dit is niet langer het geval in Python3.6, maar merk op dat het zo is niet gegarandeerd gedrag nog niet)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Voor uw voorbeeld is het een beter idee om te gebruiken dict.items():

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

Dit geeft je een lijst met tuples. Wanneer je op deze manier over deze lijnen loopt, wordt elk tuple uitgepakt k en v automatisch:

for k,v in d.items():
    print(k, 'corresponds to', v)

Gebruik makend van k en v als variabelenamen bij lus over a dict is vrij gebruikelijk als het lichaam van de lus slechts een paar regels is. Voor meer gecompliceerde loops kan het een goed idee zijn om meer beschrijvende namen te gebruiken:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

Het is een goed idee om de gewoonte te ontwikkelen om opmaakstrings te gebruiken:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

151
2017-07-21 01:27



key is gewoon een variabele.

Voor python2.x:

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... of beter,

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Voor Python3.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

42
2017-07-20 23:49



Wanneer u itereert door woordenboeken met behulp van de for .. in ..-syntax, itereert altijd over de toetsen (de waarden zijn toegankelijk via dictionary[key]).

Gebruik. Om de sleutelwaardeparen te itereren for k,v in s.iteritems().


39
2017-07-20 22:29



Dit is een veel voorkomend lusidiom. in is een operator. Voor wanneer te gebruiken for key in dict en wanneer het moet zijn for key in dict.keys() zien David Goodger's Idiomatic Python-artikel.


20
2017-07-20 22:42



U kunt dit gebruiken:

for key,val in d.items():
    print key, 'is the key for ', val

9
2018-01-14 14:42