Uruchom indeks do iteracji listy Pythona

88

Jaki jest najlepszy sposób na ustawienie indeksu początkowego podczas iteracji listy w Pythonie. Na przykład mam listę dni tygodnia - niedzielę, poniedziałek, wtorek, ... sobotę - ale chcę iterować po liście, zaczynając od poniedziałku. Jaka jest najlepsza praktyka w tym zakresie?

Vincent Catalano
źródło
1
Czy chcesz po prostu zapętlić do soboty, czy też chcesz, aby zawijało się i drukowało w ostatnią niedzielę?
juanchopanza
Chciałem po prostu pętać do soboty. Do tej pory nie zdawałem sobie sprawy, że możesz używać wycinania w listach Pythona.
Vincent Catalano
Czy istnieje rozwiązanie, które zajmuje się również generatorami / elementami iteracyjnymi, a nie tylko listami? A może naprawdę duże listy?
Charlie Parker

Odpowiedzi:

174

Możesz użyć krojenia :

for item in some_list[2:]:
    # do stuff

Zacznie się od trzeciego elementu i będzie powtarzane do końca.

Björn Pollex
źródło
2
To jest dokładnie to, czego szukałem. Dzięki!
Vincent Catalano
30
Czy to nie jest nieefektywne w przypadku dużych list? Uważam, że ta operacja wycinka musi skopiować elementy listy, do których istnieją odniesienia, do nowej listy.
UndeadKernel
4
Tak, jest to nieefektywne w przypadku dużych list. Zobacz odpowiedź gnibblerów poniżej, aby uzyskać rozwiązanie, które nie kopiuje.
Björn Pollex
jak to zrobić, jeśli używasz pętli przy użyciu generatorów / iterables?
Charlie Parker
2
Powinieneś użyć islice, jak zasugerowano w odpowiedzi Johna La Rooya.
Björn Pollex
50

islice ma tę zaletę, że nie musi kopiować części listy

from itertools import islice
for day in islice(days, 1, None):
    ...
John La Rooy
źródło
13

Zawsze możesz zapętlić, używając licznika indeksu, konwencjonalne pętle w stylu C:

for i in range(len(l)-1):
    print l[i+1]

Zawsze lepiej jest postępować zgodnie ze stylem „pętla na każdym elemencie”, ponieważ jest to normalne, ale jeśli przeszkadza, pamiętaj, że zawsze obsługiwany jest również styl konwencjonalny.

Lakshman Prasad
źródło
9

stdlib połączy cię synu!

deque.rotate():

#!/usr/local/bin/python2.7

from collections import deque

a = deque('Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '))
a.rotate(3)
deque(['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'])
synthesizerpatel
źródło
4

Jeśli chcesz to wydrukować z Mondayroku, można użyć list„s indexmetody, aby znaleźć miejsce, w którym«Poniedziałek»ma na liście, a iterate stamtąd jak wyjaśniono w innych postach. Użycie list.indexpozwala zaoszczędzić na zakodowaniu indeksu „poniedziałek”, który jest potencjalnym źródłem błędu:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d
juanchopanza
źródło
naprawdę fajne rozwiązanie!
aderchox
3

Oto generator obrotów, który nie musi tworzyć zniekształconej kopii sekwencji wejściowej ... może być przydatny, jeśli sekwencja wejściowa jest znacznie większa niż 7 elementów.

>>> def rotated_sequence(seq, start_index):
...     n = len(seq)
...     for i in xrange(n):
...         yield seq[(i + start_index) % n]
...
>>> s = 'su m tu w th f sa'.split()
>>> list(rotated_sequence(s, s.index('m')))
['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
>>>
John Machin
źródło
Tak - i byłoby łatwe do rozszerzenia, aby wygenerować nieskończoną powtarzającą się sekwencję.
lenistwo
nie mogę pomóc w podziękowaniu @JohnMachin: świetna robota dla kogoś zmarłego przez te 264 lata
jjon
1

Dlaczego ludzie używają krojenia listy (powolne, ponieważ kopiuje do nowej listy), importują funkcję biblioteki lub próbują w tym celu obrócić tablicę?

Użyj zwykłej pętli for z range(start, stop, step)(gdzie starti stepsą argumentami opcjonalnymi).

Na przykład przeglądanie tablicy zaczynającej się od indeksu 1:

for i in range(1, len(arr)):
    print(arr[i])
Charlie Su
źródło
0

Jeśli chcesz „zawinąć” i skutecznie obrócić listę, aby rozpocząć od poniedziałku (zamiast po prostu odcinać elementy przed poniedziałkiem):

dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
            'Friday', 'Saturday',  ]

startDayName = 'Monday'

startIndex = dayNames.index( startDayName )
print ( startIndex )

rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]

for x in rotatedDayNames:
    print ( x )
leniwiec
źródło