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?
88
Odpowiedzi:
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.
źródło
islice
, jak zasugerowano w odpowiedzi Johna La Rooya.islice
ma tę zaletę, że nie musi kopiować części listyfrom itertools import islice for day in islice(days, 1, None): ...
źródło
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.
źródło
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'])
źródło
Jeśli chcesz to wydrukować z
Monday
roku, można użyćlist
„sindex
metody, aby znaleźć miejsce, w którym«Poniedziałek»ma na liście, a iterate stamtąd jak wyjaśniono w innych postach. Użycielist.index
pozwala 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
źródło
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'] >>>
źródło
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)
(gdziestart
istep
są argumentami opcjonalnymi).Na przykład przeglądanie tablicy zaczynającej się od indeksu 1:
for i in range(1, len(arr)): print(arr[i])
źródło
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 )
źródło