2017-10-05 1 views
1

Ich habe eine Liste von Elementen: list = [a, b, c, d] Ich möchte jedes Element und dann time.sleep(10) ändern, bevor Sie zum nächsten weitergehen Iteration. In der letzten Iteration möchte ich das Element ändern, aber nicht schlafen.Suche nach einem eleganten Weg zu `time.sleep()` nach jeder Iteration, mit Ausnahme der letzten Iteration

for item in list: 
    # modify item 
    time.sleep(10) # avoid this line on the final iteration 

Muss nicht diese Struktur sein - für jede Methode suchen, der die Arbeit erledigt wird.

Antwort

3

Noch eine andere Lösung mit enumerate:

lst = ['a', 'b', 'c', 'd'] 
for i, v in enumerate(lst, 1 - len(lst)): 
    print(v) 
    if i: 
     print('sleeping') 

Ausgang

a 
sleeping 
b 
sleeping 
c 
sleeping 
d 
+0

Wenn ich richtig verstehe, übergeben Sie -3 als Startindex für Enumerate, um zu iterieren: -3, -2, -1, 0 und 0 als False für die 'if' Anweisung zu verwenden? – Homer

+0

@Simonsays Ja, das ist richtig. Zero ist False-ish, und Zahlen ungleich Null sind True-ish in Python. –

2

Sie können enumerate verwenden, um Index nachbilden:

for index, data in enumerate(list, 1 - len(list)): 
    if index: 
     time.sleep(10) 
+0

** 1 ** Sie können einen Startwert 'enumerate' übergeben. ** 2 ** Warum die Listenlänge bei jeder Schleifeniteration berechnen? Es wird sich nicht ändern (zumindest gehe ich davon aus, dass es sich nicht ändern wird, da es im Allgemeinen nicht ratsam ist, die Länge einer Liste zu ändern, über die du iterierst, außer du bist sehr vorsichtig). Sicher, die Listenlänge ist eine sehr schnelle Operation, aber immer noch ... –

+0

@ PM2Ring Ahh, danke für das Aufzeigen, sollte ich 'enumerate (Liste, 1 - len (Liste))' –

+0

Aber das ist genau das, was Sie schrieb @ PM2Ring. By the way, danke für das Erwähnen von 2 Punkten (sie sind wirklich hilfreich) ein Lernen für mich –

3

Sie könnten erste, schlafen, aber schlafen die erste Iteration Schlaf überspringen, statt:

for idx, item in enumerate(list): 
    if idx != 0: 
     time.sleep(10) # avoid this line on the final iteration 
    # modify item 

Es fällt auf den letzten Punkt ab, ohne Schlafen.

2

Wenn Sie das Problem invers und ein boolean fügen Sie das erste Element zu signalisieren, können Sie dies tun:

do_sleep = False 
for item in list: 
    if do_sleep: 
     time.sleep(10) # avoid this line on the first iteration. 
    else: 
     do_sleep = True 
    # modify item 
+0

Gut entdeckt! Danke, behoben. –

1
for i,item in enumerate(list): 
    # modify item 
    if i < len(list) - 1: 
     time.sleep(10) 
2

Wenn Sie vermeiden möchten, dass bei jeder Iteration das letzte Element getestet wird.

for element in elements[:-1]: 
    process_element(element) 
    time.sleep(10) 

process_element(element) 

Falls die Änderungen auf die Elemente in der Liste angewendet werden müssen (ohne eine neue zu erstellen).

for index, _ in enumerate(elements[:-1]): 
    process_element(elements, index) 
    time.sleep(10) 

process_element(elements, -1) 

def process_element(elements, index): 
    elements[index] += 1 

Wenn Sie die Liste kopieren vermeiden möchten, können Sie islice verwenden. Beachten Sie, dass len ([]) O (1) Kosten hat.

for element in islice(elements, len(elements) - 1): 
    ... 

for index, _ in enumerate(islice(elements, len(elements) - 1)): 
    ... 
+0

Wäre das nicht alles Modifizieren des letzten Artikels? – Homer

+1

Die Methode [islice] (https://docs.python.org/3/library/itertools.html#itertools.islice) kann mit der Referenzkopie umgehen. – noxdafox

+0

@Simonsays Das letzte Element wird außerhalb der Schleife verarbeitet. –

Verwandte Themen