2017-10-05 21 views
1

私はアイテムのリストを持っています:list = [a, b, c, d] 各アイテムを変更したいですが、次にtime.sleep(10)繰り返し。最後の反復では、アイテムを修正したいが、眠らないようにしたい。最後の繰り返しを除いて、すべての繰り返しの後に `time.sleep()`を探します。

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

この構造にする必要はありません。ジョブを実行する方法を探してください。

あなたは、インデックスを追跡するために enumerateを使用することができます

答えて

3

enumerateを使用してさらに別の解決策:

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

出力

a 
sleeping 
b 
sleeping 
c 
sleeping 
d 
+0

正しく理解していれば、列挙の開始インデックスとして-3を渡しています:-3、-2、-1、0、そして 'if'ステートメントのFalseとして0を使用していますか? – Homer

+0

@Simonsaysはい、そうです。ゼロはFalse-ishで、ゼロ以外の数字はPythonでTrue-ishです。 –

2

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

** 1 **開始値に 'enumerate'を渡すことができます。 ** 2 **なぜ各ループの繰り返しでリストの長さを計算するのですか?変更するつもりはありません(少なくとも、あなたが非常に慎重でない限り、あなたが反復処理しているリストの長さを変更することは一般的に賢明ではないので、変更しないことを前提としています)。確かに、リストの長さを取得するのは非常に高速ですが、まだ... –

+0

@ PM2Ringああ、指摘してくれてありがとう、私は 'enumerate(list、1 - len(list))'を使うべきです –

+0

しかし、 @ PM2Ringを書いた。ところで、2点(彼らは本当に有用です)を言及していただきありがとうございます私のための学習 –

3

あなたが最初の睡眠が、その代わりに、睡眠に最初の反復睡眠をスキップすることができます:

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

それはせずに、最後の項目で落ちます睡眠。

2

あなたが問題を逆し、あなたがこれを行うことができ、最初の要素を通知するブール値を追加する場合:

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

よく点検!ありがとう、修正されました。 –

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

各反復で最後の要素のテストを避けたい場合。

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

process_element(element) 

リスト内の要素に変更を適用する必要がある場合(新しいものを作成せずに)。

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 

リストをコピーしないようにするには、isliceを使用できます。 len([])にはO(1)のコストがあることに注意してください。

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

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

最後の項目も同様に変更しないでください。 – Homer

+1

[islice](https://docs.python.org/3/library/itertools.html#itertools.islice)メソッドは参照コピーを処理できます。 – noxdafox

+0

@Simonsays最後の項目はループ外で処理されます。 –

関連する問題