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?
88
Réponses:
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.
la source
islice
, comme suggéré dans la réponse de John La Rooy.islice
a l'avantage de ne pas avoir besoin de copier une partie de la listefrom itertools import islice for day in islice(days, 1, None): ...
la source
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.
la source
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'])
la source
Si tout ce que vous voulez est d'imprimer à
Monday
partir de maintenant, vous pouvez utiliserlist
laindex
mé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'utilisationlist.index
vous é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
la source
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'] >>>
la source
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ùstart
etstep
sont 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])
la source
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 )
la source