Iniciar índice para iterar a lista Python

88

Qual é a melhor maneira de definir um índice inicial ao iterar uma lista em Python. Por exemplo, tenho uma lista dos dias da semana - domingo, segunda, terça, ... sábado - mas quero iterar a lista começando na segunda. Qual é a prática recomendada para fazer isso?

Vincent Catalano
fonte
1
Você deseja apenas repetir até sábado ou deseja encerrar e imprimir no último domingo?
juanchopanza
Eu só queria fazer um loop até sábado. Eu não tinha percebido até agora que você pode usar o fatiamento em listas Python.
Vincent Catalano
existe uma solução que lida com geradores / iteráveis ​​também e não apenas listas? Ou listas realmente grandes?
Charlie Parker

Respostas:

174

Você pode usar o fatiamento :

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

Isso vai começar no terceiro elemento e iterar até o final.

Björn Pollex
fonte
2
Isso é exatamente o que eu estava procurando. Obrigado!
Vincent Catalano
30
Isso não é ineficiente para listas grandes? Acredito que essa operação de slice deve copiar os elementos da lista que estão sendo referenciados em uma nova lista.
UndeadKernel
4
Sim, isso é ineficiente para listas grandes. Veja a resposta dos gnibblers abaixo para uma solução que não copia.
Björn Pollex
como fazer isso se você estiver usando um loop usando geradores / iteráveis?
Charlie Parker
2
O que você deve usar islice, conforme sugerido na resposta de John La Rooy.
Björn Pollex
50

islice tem a vantagem de não precisar copiar parte da lista

from itertools import islice
for day in islice(days, 1, None):
    ...
John La Rooy
fonte
13

Você sempre pode fazer um loop usando um contador de índice do loop estilo C convencional:

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

É sempre melhor seguir o estilo "loop em cada elemento" porque essa é a coisa normal a fazer, mas se isso atrapalhar, lembre-se que o estilo convencional também é compatível, sempre.

Lakshman Prasad
fonte
9

stdlib vai ligar você, filho!

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
fonte
4

Se tudo o que você deseja é imprimir a partir Mondayde então, você pode usar listo indexmétodo de para encontrar a posição onde "segunda-feira" está na lista e iterar a partir daí, conforme explicado em outros posts. O uso list.indexevita que você codifique o índice para "segunda-feira", que é uma fonte potencial de erro:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d
Juanchopanza
fonte
solução muito boa!
aderchox
3

Aqui está um gerador de rotação que não precisa fazer uma cópia distorcida da sequência de entrada ... pode ser útil se a sequência de entrada for muito maior do que 7 itens.

>>> 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
fonte
Sim - e seria fácil de estender para gerar uma sequência recorrente infinita.
slothrop de
não posso deixar de agradecer a @JohnMachin: ótimo trabalho para alguém que morreu há 264 anos
jjon
1

Por que as pessoas estão usando o fatiamento de lista (lento porque ele copia para uma nova lista), importando uma função de biblioteca ou tentando girar um array para isso?

Use um for-loop normal com range(start, stop, step)(onde starte stepsão argumentos opcionais).

Por exemplo, percorrendo uma matriz começando no índice 1:

for i in range(1, len(arr)):
    print(arr[i])
Charlie Su
fonte
0

Se você quiser "encerrar" e efetivamente girar a lista para começar na segunda-feira (em vez de apenas cortar os itens antes de segunda-feira):

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 )
preguiça
fonte