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?

Vincent Catalano
quelle
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.

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

Lakshman Prasad
quelle
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'])
Synthesizerpatel
quelle
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
Juanchopanza
quelle
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']
>>>
John Machin
quelle
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 )
Faultier
quelle
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])
Charlie Su
quelle