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?
88
Respostas:
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.
fonte
islice
, conforme sugerido na resposta de John La Rooy.islice
tem a vantagem de não precisar copiar parte da listafrom itertools import islice for day in islice(days, 1, None): ...
fonte
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.
fonte
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'])
fonte
Se tudo o que você deseja é imprimir a partir
Monday
de então, você pode usarlist
oindex
método de para encontrar a posição onde "segunda-feira" está na lista e iterar a partir daí, conforme explicado em outros posts. O usolist.index
evita 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
fonte
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'] >>>
fonte
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)
(ondestart
estep
são argumentos opcionais).Por exemplo, percorrendo uma matriz começando no índice 1:
for i in range(1, len(arr)): print(arr[i])
fonte
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 )
fonte