1053 Stimmen

Durchlaufen einer Liste in umgekehrter Reihenfolge in Python

Ich kann also beginnen mit collection[len(collection)-1] und enden mit collection[0] .

Ich möchte auch auf den Schleifenindex zugreifen können.

41voto

tzot Punkte 86792

El reversed eingebaute Funktion ist praktisch:

for item in reversed(sequence):

El Dokumentation for reversed erklärt seine Grenzen.

Für die Fälle, in denen ich eine Sequenz in umgekehrter Richtung zusammen mit dem Index durchlaufen muss (z. B. für In-Place-Änderungen, die die Sequenzlänge ändern), habe ich diese Funktion in meinem Codeutil-Modul definiert:

from six.moves import zip as izip, range as xrange

def reversed_enumerate(sequence):
    return izip(
        reversed(xrange(len(sequence))),
        reversed(sequence),
    )

Dadurch wird vermieden, dass eine Kopie der Sequenz erstellt wird. Offensichtlich ist die reversed Einschränkungen gelten weiterhin.

16voto

disooqi Punkte 512

Sie können auch die Funktionen "Bereich" oder "Anzahl" verwenden. Wie folgt:

a = ["foo", "bar", "baz"]
for i in range(len(a)-1, -1, -1):
    print(i, a[i])

3 baz
2 bar
1 foo

Sie könnten auch "count" aus itertools wie folgt verwenden:

a = ["foo", "bar", "baz"]
from itertools import count, takewhile

def larger_than_0(x):
    return x > 0

for x in takewhile(larger_than_0, count(3, -1)):
    print(x, a[x-1])

3 baz
2 bar
1 foo

15voto

Barney Szabolcs Punkte 11037

In Python 3 erstellt list eine Kopie, also reversed(list(enumerate(collection)) ineffizient sein könnte, wird die Erstellung einer weiteren Liste nicht wegoptimiert.

Wenn es sich bei der Sammlung um eine Liste handelt, ist es vielleicht am besten, die Komplexität hinter einem Iterator zu verstecken

def reversed_enumerate(collection: list):
    for i in range(len(collection)-1, -1, -1):
        yield i, collection[i]

Also, das sauberste ist:

for i, elem in reversed_enumerate(['foo', 'bar', 'baz']):
    print(i, elem)

13voto

James Punkte 14623

Wie wäre es, ohne eine neue Liste zu erstellen, können Sie durch Indizierung zu tun:

>>> foo = ['1a','2b','3c','4d']
>>> for i in range(len(foo)):
...     print foo[-(i+1)]
...
4d
3c
2b
1a
>>>

OR

>>> length = len(foo)
>>> for i in range(length):
...     print foo[length-i-1]
...
4d
3c
2b
1a
>>>

13voto

Freddy Punkte 1898
>>> l = ["a","b","c","d"]
>>> l.reverse()
>>> l
['d', 'c', 'b', 'a']

OR

>>> print l[::-1]
['d', 'c', 'b', 'a']

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X