Index de démarrage pour l'itération de la liste Python


88

Quelle est la meilleure façon de définir un index de départ 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 du lundi. Quelle est la meilleure pratique pour ce faire?


1
Voulez-vous juste faire une boucle jusqu'à samedi, ou voulez-vous qu'il soit bouclé et imprimé dimanche dernier?
juanchopanza

Je voulais juste faire une boucle jusqu'à samedi. Je n'avais pas réalisé jusqu'à présent que vous pouvez utiliser le découpage dans les listes Python.
Vincent Catalano

existe-t-il une solution qui traite également des générateurs / itérables et pas seulement des listes? Ou de très grandes listes?
Charlie Parker

Réponses:


174

Vous pouvez utiliser le tranchage :

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

Cela commencera au troisième élément et itérera jusqu'à la fin.


2
Ceci est exactement ce que je cherchais. Merci!
Vincent Catalano

30
N'est-ce pas inefficace pour les grandes listes? Je crois que cette opération de tranche doit copier les éléments de liste référencés dans une nouvelle liste.
UndeadKernel

4
Oui, c'est inefficace pour les grandes listes. Voir la réponse des gnibblers ci-dessous pour une solution qui ne copie pas.
Björn Pollex

comment faire cela si vous faites une boucle en utilisant des générateurs / itérables?
Charlie Parker

2
Vous devriez utiliser islice, comme suggéré dans la réponse de John La Rooy.
Björn Pollex

50

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):
    ...

13

Vous pouvez toujours boucler en utilisant un compteur d'index le bouclage de style C conventionnel:

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 simplement que le style conventionnel est également pris en charge, toujours.


9

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

4

Si tout ce que vous voulez est d'imprimer à Mondaypartir de maintenant, vous pouvez utiliser listla indexméthode de pour trouver la position où "Lundi" est dans la liste, et itérer à partir de là comme expliqué dans d'autres articles. L'utilisation list.indexvous évite de coder en dur l'index pour "Lundi", qui est une source potentielle d'erreur:

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

solution vraiment sympa!
aderchox

3

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

Oui - et serait facile à étendre pour générer une séquence récurrente infinie.
paresseux

ne peut s'empêcher de remercier @JohnMachin: excellent travail pour quelqu'un mort ces 264 ans
jjon

1

Pourquoi les gens utilisent-ils le découpage de liste (lent car il copie dans une nouvelle liste), importent une fonction de bibliothèque ou essaient de faire pivoter un tableau pour cela?

Utilisez une boucle for normale avec range(start, stop, step)(où startet stepsont des arguments facultatifs).

Par exemple, faire une boucle dans un tableau commençant à l'index 1:

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

0

Si vous voulez "boucler" et faire pivoter efficacement la liste pour commencer le lundi (plutôt que de simplement couper les éléments avant le 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 )
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.