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?

Vincent Catalano
la source
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.

Björn Pollex
la source
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):
    ...
John La Rooy
la source
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.

Lakshman Prasad
la source
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'])
synthétiseurpatel
la source
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
juanchopanza
la source
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']
>>>
John Machin
la source
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])
Charlie Su
la source
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 )
paresseux
la source