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.