webentwicklung-frage-antwort-db.com.de

Was ist die Pythonic-Methode, um OrderedDict zu durchlaufen

Ich habe ein OrderedDict und in einer Schleife möchte ich Index, Schlüssel und Wert erhalten. Es ist sicher, dass es mehrere Möglichkeiten gibt, d. H.

a = collections.OrderedDict({…})
for i,b,c in Zip(range(len(a)), a.iterkeys(), a.itervalues()):
  …

Ich möchte jedoch den Bereich (len (a)) vermeiden und a.iterkeys (), a.itervalues ​​() auf etwas wie a.iteritems () ..__ verkürzen

for i,d in enumerate(a.iteritems()):
  b,c = d

Es ist jedoch erforderlich, innerhalb des Schleifenkörpers auszupacken. Gibt es eine Möglichkeit, eine for-Anweisung auszupacken, oder eine elegantere Methode für die Iteration?

25
Askold Ilvento

Sie können das Tuple-Auspacken in for-Anweisung verwenden:

for i, (key, value) in enumerate(a.iteritems()):
    # Do something with i, key, value

>>> d = {'a': 'b'}
>>> for i, (key, value) in enumerate(d.iteritems()):
...     print i, key, value
... 
0 a b

Randnotiz:

Verwenden Sie in Python 3.x dict.items() , um eine iterierbare Wörterbuchansicht zurückzugeben.

>>> for i, (key, value) in enumerate(d.items()):
...     print(i, key, value)
49
falsetru
$ python
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information. 
>>> import collections
>>> a = collections.OrderedDict({'a':'1','b':'2'})
>>> a
OrderedDict([('a', '1'), ('b', '2')])
>>> for i, (k,v) in enumerate(a.iteritems()):
...    print i, k, v
... 
0 a 1
1 b 2

Ist hässlich, wenn du mich fragst. 

Ich weiß nicht, warum Sie sich für den Index interessieren. Die Idee zwischen Diktieren ist, dass Sie den Index nicht kennen sollen .. Es gibt eine ganze Menge Logik hinter Diktieren und Warteschlangen, so dass wir es tun sollen frei von Indizes sein.

Wenn Sie darauf bestehen, den Index zu erhalten, müssen Sie ihn nicht zweimal wiederholen.

Mal sehen, was Enumerate mit Listen macht: 

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']    
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

Beachten Sie den "Start".

Enumerate kann Listen verwalten. Wörterbücher speichern Daten als Liste, irgendwo im Bauch des Tieres. Was passiert also, wenn wir die Aufzählung eines Diktats verwenden?

>>> for i,k in enumerate(a):
...    print i,k
... 
0 a
1 b

In diesem Licht würde ich für das elegante gehen:

>>> for i,k in enumerate(a):
...    print i,k,a[k]
... 
0 a 1
1 b 2

Ich habe das Gefühl, dass "für i, (k, v) in" zu früh zu viel von der inneren Struktur zeigt. Mit "für i, k in" sind wir geschützt, und wenn die Umgestaltung vonnöten ist, brauchen wir nicht die Art und Weise berühren, in der wir uns bewegen. Wir müssen nur das ändern, was wir in der Schleife tun. Ein Aspekt weniger zu beachten. 

Ganz zu schweigen davon, dass dieser Aufruf zur Aufzählung in jedem Python nach 2.6 genauso funktioniert :)

https://docs.python.org/2/library/stdtypes.html#dict.iteritems

https://docs.python.org/2/library/functions.html#enumerate

2
Andrei

Verwenden Sie die Methoden values oder items, um eine view abzurufen, und geben Sie sie als iterator ein:

z.B. um nach den Werten in Ihrem Wörterbuch zu sortieren

sorted(iter(my_dict.values()))
0
SumNeuron