Starten Sie den Index für die Iteration der Python-Liste


87

Was ist der beste Weg, um einen Startindex festzulegen, wenn eine Liste in Python iteriert wird? Zum Beispiel habe ich eine Liste der Wochentage - Sonntag, Montag, Dienstag, ... Samstag -, aber ich möchte die Liste ab Montag durchlaufen. Was ist die beste Vorgehensweise dafür?


1
Möchten Sie nur bis Samstag eine Schleife erstellen oder möchten Sie, dass der letzte Sonntag umgedreht und gedruckt wird?
Juanchopanza

Ich wollte nur bis Samstag eine Schleife machen. Ich hatte bis jetzt nicht bemerkt, dass Sie Slicing in Python-Listen verwenden können.
Vincent Catalano

Gibt es eine Lösung, die sich auch mit Generatoren / Iterablen und nicht nur mit Listen befasst? Oder wirklich große Listen?
Charlie Parker

Antworten:


172

Sie können das Schneiden verwenden :

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

Dies beginnt beim dritten Element und wird bis zum Ende wiederholt.


2
Genau das habe ich gesucht. Vielen Dank!
Vincent Catalano

27
Ist das nicht ineffizient für große Listen? Ich glaube, diese Slice-Operation muss die Listenelemente, auf die verwiesen wird, in eine neue Liste kopieren.
UndeadKernel

3
Ja, dies ist für große Listen ineffizient. In der Antwort von Gnibblers unten finden Sie eine Lösung, die nicht kopiert werden kann.
Björn Pollex

Wie machst du das, wenn du eine Schleife mit Generatoren / Iterables machst?
Charlie Parker

2
Das sollten Sie verwenden islice, wie in John La Rooys Antwort vorgeschlagen.
Björn Pollex

49

islice hat den Vorteil, dass kein Teil der Liste kopiert werden muss

from itertools import islice
for day in islice(days, 1, None):
    ...

13

Sie können immer eine Schleife mit einem Indexzähler der herkömmlichen Schleife im C-Stil ausführen:

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

Es ist immer besser, dem Stil "Schleife für jedes Element" zu folgen, da dies normal ist. Wenn dies jedoch im Weg steht, denken Sie daran, dass der herkömmliche Stil immer unterstützt wird.


9

stdlib wird dich anschließen, mein Sohn!

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

Wenn Sie nur von nun an drucken möchten Monday, können Sie mithilfe listder indexMethode die Position ermitteln, an der sich "Montag" in der Liste befindet, und von dort aus iterieren, wie in anderen Beiträgen erläutert. Durch die Verwendung von list.indexspart Sie den Index für "Montag" fest, was eine potenzielle Fehlerquelle darstellt:

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

wirklich schöne Lösung!
Aderchox

3

Hier ist ein Rotationsgenerator, der keine verzerrte Kopie der Eingabesequenz erstellen muss ... kann nützlich sein, wenn die Eingabesequenz viel größer als 7 Elemente ist.

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

Ja - und wäre einfach zu erweitern, um eine unendlich wiederkehrende Sequenz zu generieren.
Faultier

Ich kann nicht anders, als mich bei John Johnachin zu bedanken: Großartige Arbeit für jemanden, der in diesen 264 Jahren
gestorben ist

0

Wenn Sie die Liste "umwickeln" und effektiv drehen möchten, um mit Montag zu beginnen (anstatt nur die Elemente vor Montag abzuschneiden):

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

Warum verwenden Benutzer das Schneiden von Listen (langsam, weil es in eine neue Liste kopiert), importieren eine Bibliotheksfunktion oder versuchen, ein Array dafür zu drehen?

Verwenden Sie eine normale for-Schleife mit range(start, stop, step)(wobei startund stepoptionale Argumente sind).

Beispiel: Durchlaufen eines Arrays ab Index 1:

for i in range(1, len(arr)):
    print(arr[i])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.