Inizia l'indice per l'iterazione dell'elenco Python


90

Qual è il modo migliore per impostare un indice iniziale durante l'iterazione di un elenco in Python. Ad esempio, ho un elenco dei giorni della settimana - domenica, lunedì, martedì, ... sabato - ma voglio scorrere l'elenco a partire da lunedì. Qual è la migliore pratica per farlo?


1
Vuoi solo andare in loop fino a sabato o vuoi che si avvolga e stampi domenica scorsa?
juanchopanza

Volevo solo andare in loop fino a sabato. Fino ad ora non mi ero reso conto che puoi usare l'affettatura negli elenchi di Python.
Vincent Catalano

esiste una soluzione che si occupi anche di generatori / iterabili e non solo liste? O elenchi davvero grandi?
Charlie Parker

Risposte:


177

Puoi usare l' affettatura :

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

Questo inizierà dal terzo elemento e proseguirà fino alla fine.


2
Questo e 'esattamente quello che stavo cercando. Grazie!
Vincent Catalano

30
Non è inefficiente per elenchi di grandi dimensioni? Credo che questa operazione di slice debba copiare gli elementi dell'elenco a cui si fa riferimento in un nuovo elenco.
UndeadKernel

4
Sì, questo è inefficiente per elenchi di grandi dimensioni. Vedi la risposta di gnibblers di seguito per una soluzione che non copia.
Björn Pollex

come si fa se si sta eseguendo un ciclo utilizzando generatori / iterabili?
Charlie Parker

2
Dovresti usare islice, come suggerito nella risposta di John La Rooy.
Björn Pollex

52

islice ha il vantaggio di non dover copiare parte dell'elenco

from itertools import islice
for day in islice(days, 1, None):
    ...

13

Puoi sempre eseguire il ciclo utilizzando un contatore di indice il ciclo convenzionale in stile C:

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

È sempre meglio seguire lo stile "loop su ogni elemento" perché è la cosa normale da fare, ma se ti ostacola, ricorda che anche lo stile convenzionale è supportato, sempre.


9

stdlib ti collegherà figlio!

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'])

4

Se tutto ciò che vuoi è stampare da in Mondaypoi, puoi usare listil indexmetodo di per trovare la posizione in cui "lunedì" è nella lista, e iterare da lì come spiegato in altri post. L'utilizzo list.indexconsente di risparmiare la codifica a freddo dell'indice per "lunedì", che è una potenziale fonte di errore:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d

soluzione davvero bella!
aderchox

3

Ecco un generatore di rotazione che non ha bisogno di fare una copia deformata della sequenza di input ... può essere utile se la sequenza di input è molto più grande di 7 elementi.

>>> 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']
>>>

Sì, e sarebbe facile estenderlo per generare una sequenza ricorrente infinita.
slothrop

non posso fare a meno di ringraziare @JohnMachin: ottimo lavoro per qualcuno morto in questi 264 anni
jjon

1

Perché le persone usano la suddivisione degli elenchi (lenta perché copia in un nuovo elenco), importano una funzione di libreria o cercano di ruotare un array per questo?

Usa un normale ciclo for con range(start, stop, step)(dove starte stepsono argomenti opzionali).

Ad esempio, scorrere un array a partire dall'indice 1:

for i in range(1, len(arr)):
    print(arr[i])

0

Se vuoi "concludere" e ruotare in modo efficace l'elenco per iniziare con lunedì (invece di tagliare gli elementi prima di lunedì):

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 )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.