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.

11voto

lkraider Punkte 3863

Mir gefällt der Ansatz mit dem Einzeilergenerator:

((i, sequence[i]) for i in reversed(xrange(len(sequence))))

7voto

emorphus Punkte 485

Was auch immer es wert ist, man kann es auch so machen. sehr einfach.

a = [1, 2, 3, 4, 5, 6, 7]
for x in xrange(len(a)):
    x += 1
    print a[-x]

7voto

Bill Konrad Punkte 337

Verwenden Sie list.reverse() und iterieren Sie dann wie gewohnt.

http://docs.python.org/tutorial/datastructures.html

6voto

Jase Punkte 41
def reverse(spam):
    k = []
    for i in spam:
        k.insert(0,i)
    return "".join(k)

5voto

wonder.mice Punkte 6676

Angenommen, die Aufgabe besteht darin, das letzte Element zu finden, das eine Bedingung in einer Liste erfüllt (d.h. das erste, wenn man rückwärts schaut), dann erhalte ich folgende Zahlen.

Python 2:

>>> min(timeit.repeat('for i in xrange(len(xs)-1,-1,-1):\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.6937971115112305
>>> min(timeit.repeat('for i in reversed(xrange(0, len(xs))):\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.809093952178955
>>> min(timeit.repeat('for i, x in enumerate(reversed(xs), 1):\n    if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
4.931743860244751
>>> min(timeit.repeat('for i, x in enumerate(xs[::-1]):\n    if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
5.548468112945557
>>> min(timeit.repeat('for i in xrange(len(xs), 0, -1):\n    if 128 == xs[i - 1]: break', setup='xs, n = range(256), 0', repeat=8))
6.286104917526245
>>> min(timeit.repeat('i = len(xs)\nwhile 0 < i:\n    i -= 1\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
8.384078979492188

Also, die hässlichste Option xrange(len(xs)-1,-1,-1) ist die schnellste.

Python 3 (andere Maschine):

>>> timeit.timeit('for i in range(len(xs)-1,-1,-1):\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', number=400000)
4.48873088900001
>>> timeit.timeit('for i in reversed(range(0, len(xs))):\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', number=400000)
4.540959084000008
>>> timeit.timeit('for i, x in enumerate(reversed(xs), 1):\n    if 128 == x: break', setup='xs, n = range(256), 0', number=400000)
1.9069805409999958
>>> timeit.timeit('for i, x in enumerate(xs[::-1]):\n    if 128 == x: break', setup='xs, n = range(256), 0', number=400000)
2.960720073999994
>>> timeit.timeit('for i in range(len(xs), 0, -1):\n    if 128 == xs[i - 1]: break', setup='xs, n = range(256), 0', number=400000)
5.316207007999992
>>> timeit.timeit('i = len(xs)\nwhile 0 < i:\n    i -= 1\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', number=400000)
5.802550058999998

Hier, enumerate(reversed(xs), 1) ist die schnellste.

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