web-dev-qa-db-fra.com

Index de démarrage pour itération Python list

Quel est le meilleur moyen de définir un index de début lors de l'itération d'une liste en Python. Par exemple, j'ai une liste des jours de la semaine - dimanche, lundi, mardi, ... samedi - mais je veux parcourir la liste à partir de lundi. Quelle est la meilleure pratique pour cela?

65
Vincent Catalano

Vous pouvez utiliser slicing :

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

Cela commencera au troisième élément et ira à la fin.

141
Björn Pollex

islice a l'avantage de ne pas avoir besoin de copier une partie de la liste

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

Vous pouvez toujours faire une boucle en utilisant un compteur d'indexage la boucle de style C conventionnelle:

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

Il est toujours préférable de suivre le style "boucle sur chaque élément" car c'est la chose normale à faire, mais si cela vous gêne, rappelez-vous que le style conventionnel est également toujours pris en charge.

12
Lakshman Prasad

stdlib va ​​vous brancher fils!

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

Voici un générateur de rotation qui n'a pas besoin de faire une copie déformée de la séquence d'entrée ... peut être utile si la séquence d'entrée est beaucoup plus grande que 7 éléments.

>>> 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']
>>>
3
John Machin

Si vous souhaitez uniquement imprimer à partir de Monday, vous pouvez utiliser la méthode list de index pour trouver la position où "lundi" figure dans la liste, puis effectuer une itération expliqué dans d'autres articles. En utilisant list.index vous évite de coder en dur l’index de "Monday", source potentielle d’erreur:

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

Si vous souhaitez "parcourir" la liste et la faire pivoter pour commencer par lundi (au lieu de simplement supprimer les éléments avant lundi):

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 )
0
slothrop