Więc mogę zacząć od len(collection)
i zakończyć collection[0]
.
Chcę także mieć dostęp do indeksu pętli.
Użyj wbudowanej reversed()
funkcji:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
Aby uzyskać dostęp do oryginalnego indeksu, użyj go enumerate()
na liście przed przekazaniem go do reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
Ponieważ enumerate()
zwraca generator i generatory nie mogą być odwrócone, musisz przekonwertować go na list
pierwszy.
reversed()
nie modyfikuje listy.reversed()
nie tworzy kopii listy (w przeciwnym razie wymagałoby dodatkowej pamięci O (N)). Jeśli chcesz zmodyfikować listę, użyjalist.reverse()
; jeśli potrzebujesz kopii listy w odwrotnej kolejności użyjalist[::-1]
.Możesz to zrobić:
(Lub cokolwiek chcesz zrobić w pętli for.)
[::-1]
Plaster odwraca listy w pętli for (ale nie będzie faktycznie zmodyfikować swoją listę „stałe”).źródło
[::-1]
tworzy płytką kopię, dlatego nie zmienia tablicy ani „na stałe”, ani „tymczasowo”.0
, prawdopodobnie-1
, więc kończy się na początku ) i krok :-1
(iteruje wstecz przez listę,1
element na raz).reversed()
Jeśli potrzebujesz indeksu pętli i nie chcesz dwukrotnie przeglądać całej listy lub użyć dodatkowej pamięci, napisałbym generator.
źródło
reversed(xrange(len(L)))
produkuje takie same wskaźniki jakxrange(len(L)-1, -1, -1)
.for index, item in enumerate(reversed(L)): print len(L)-1-index, item
Można to zrobić w następujący sposób:
Więc twoje przypuszczenie było dość bliskie :) Trochę niezręczne, ale w gruncie rzeczy mówi: zacznij od 1 mniej niż
len(collection)
, idź dalej, aż dojdziesz do tuż przed -1, krokami co -1.Fyi,
help
funkcja jest bardzo przydatna, ponieważ pozwala przeglądać dokumenty dotyczące czegoś z konsoli Python, np .:help(range)
źródło
-1
. Chciałbym tylko powiedziećreversed(xrange(len(collection)))
reversed
Funkcja wbudowana jest pod ręką:Dokumentacja dla odwróconych wyjaśnia swoje ograniczenia.
W przypadkach, w których muszę przejść sekwencję w odwrotnej kolejności wraz z indeksem (np. W przypadku modyfikacji w miejscu zmieniających długość sekwencji), mam tę funkcję, która zdefiniowała mój moduł codeutil:
Ten unika tworzenia kopii sekwencji. Oczywiście
reversed
ograniczenia nadal obowiązują.źródło
A co powiesz na to, bez ponownego tworzenia nowej listy, możesz to zrobić, indeksując:
LUB
źródło
LUB
źródło
Podoba mi się podejście do generatora z jedną linią:
źródło
Możesz także użyć funkcji „zakres” lub „liczenie”. Następująco:
Możesz również użyć „count” z itertools w następujący sposób:
źródło
3 foo\n2 bar\n1 baz
Użyj,
list.reverse()
a następnie iteruj tak jak zwykle.http://docs.python.org/tutorial/datastructures.html
źródło
Podejście bez importu:
lub
źródło
źródło
bo cokolwiek warto, możesz to zrobić w ten sposób. bardzo prosta.
źródło
print a[-(x+1)]
i uniknąć ponownego przypisania indeksu w treści pętli.Ekspresyjny sposób na osiągnięcie
reverse(enumerate(collection))
w Pythonie 3:w python 2:
Nie jestem pewien, dlaczego nie mamy na to skrótu, np .:
lub dlaczego nie mamy
reversed_range()
źródło
Jeśli potrzebujesz indeksu, a lista jest niewielka, najbardziej czytelnym sposobem jest zrobienie
reversed(list(enumerate(your_list)))
tego, co mówi zaakceptowana odpowiedź. Ale ta tworzy kopię listy, więc jeśli lista jest podejmowanie dużą część swojej pamięci musisz odjąć wskaźnik zwracany przezenumerate(reversed())
zlen()-1
.Jeśli musisz to zrobić tylko raz:
lub jeśli musisz to zrobić wiele razy, powinieneś użyć generatora:
źródło
przydatna jest tu funkcja odwrotna:
źródło
Możesz także użyć
while
pętli:źródło
Możesz użyć indeksu ujemnego w zwykłej pętli for:
Aby uzyskać dostęp do indeksu, tak jakbyś wykonywał iterację do przodu w odwróconej kopii kolekcji, użyj
i - 1
:Aby uzyskać dostęp do oryginalnego, nieodwróconego indeksu, użyj
len(collection) - i
:źródło
Jeśli nie przeszkadza ci, że indeks jest ujemny, możesz:
źródło
Myślę, że najbardziej eleganckim sposobem jest transformacja
enumerate
ireversed
użycie następującego generatoraktóry generuje odwrotność
enumerate
iteratoraPrzykład:
Wynik:
źródło
Inne odpowiedzi są dobre, ale jeśli chcesz zrobić to w stylu listy
źródło
Aby użyć ujemnych wskaźników: zacznij od -1 i cofaj się o -1 przy każdej iteracji.
źródło
Prosty sposób:
źródło
myślę, że ten jest również prostym sposobem na zrobienie tego ... czytaj od końca i zmniejszaj do końca listy, ponieważ nigdy nie wykonujemy indeksu „end”, dlatego dodaliśmy -1
źródło
Zakładając, że zadaniem jest znalezienie ostatniego elementu, który spełnia jakiś warunek na liście (tj. Pierwszy, gdy patrzę wstecz), otrzymuję następujące liczby:
Zatem najbrzydsza opcja
xrange(len(xs)-1,-1,-1)
jest najszybsza.źródło
możesz użyć generatora:
Wreszcie:
mam nadzieję, że ci to pomoże.
źródło