基本的に、特定の条件が満たされた場合にアクションを実行した後、制御をforループの先頭に戻す方法が必要ですそして実際には反復プロセス全体を再開します。
私がやろうとしていることはこれです:
for index, item in enumerate(list2):
if item == '||' and list2[index-1] == '||':
del list2[index]
*<some action that resarts the whole process>*
そうすれば、['berry'、 '||'、 '||'、 '||'、 'pancake]がリスト内にある場合、次のようになります。
代わりに['ベリー'、 '||'、 'パンケーキ']。
ありがとう!
「再起動」とはどういう意味かわかりません。最初から繰り返しを開始しますか、それとも単に現在の繰り返しをスキップしますか?
後者の場合、for
ループはcontinue
ループと同じようにwhile
をサポートします。
for i in xrange(10):
if i == 5:
continue
print i
上記は、5を除く0から9までの数字を出力します。
for
ループの最初からやり直すことについて話している場合、たとえばwhile
ループでラップするなど、「手動」以外にそれを行う方法はありません。
should_restart = True
while should_restart:
should_restart = False
for i in xrange(10):
print i
if i == 5:
should_restart = True
break
上記は0から5までの数字を出力し、次に0からやり直します。以下同様に無期限に続きます(本当に良い例ではありません、私は知っています)。
while True:
for i in xrange(10):
if condition(i):
break
else:
break
それはあなたが望むように見えることをするでしょう。なぜそれをやりたいのかは別の問題です。たぶん、あなたはあなたのコードを見て、あなたがそれをするための明白でより簡単な方法を見逃していないことを確認するべきです。
プロセス全体を再構築するいくつかのアクション
アルゴリズムを考えるのに悪い方法。
フィルタリングしているだけです。つまり、重複を削除しています。
そして-in Python -del
を実行しようとするのではなく、コピーを作成するのが最も幸せです。一般に、del
を使用する呼び出しはほとんどありません。
def unique( some_list ):
list_iter= iter(some_list)
prev= list_iter.next()
for item in list_iter:
if item != prev:
yield prev
prev= item
yield prev
list( unique( ['berry','||','||','||','pancake'] ) )
それがちょうど私に来たので、避けられないitertoolsバージョン:
from itertools import groupby
def uniq(seq):
for key, items in groupby(seq):
yield key
print list(uniq(['berry','||','||','||','pancake'])) # ['berry','||', 'pancake']
# or simply:
print [key for key, items in groupby(['berry','||','||','||','pancake'])]
Continue
はどのループでも機能します。
continue
はforループでも機能します。
>>> for i in range(3):
... print 'Before', i
... if i == 1:
... continue
... print 'After', i
...
Before 0
After 0
Before 1
# After 1 is missing
Before 2
After 2
ご覧のとおり、質問に答えると、かなり複雑なコードになります。通常、より良い方法を見つけることができます。そのため、そのような構造は言語に組み込まれていません。
Itertoolsの使用に慣れていない場合は、代わりにこのループの使用を検討してください。 forループを再起動するよりも追跡が簡単であるだけでなく、すでに渡されたアイテムを再チェックする時間を無駄にしないため、より効率的です。
L = ['berry','||','||','||','pancake']
idx=1
while idx<len(L):
if L[idx-1]==L[idx]:
del L[idx]
else:
idx+=1
def remove_adjacent(nums):
return [a for a,b in Zip(nums, nums[1:]+[not nums[-1]]) if a != b]
example = ['berry','||','||','||','pancake']
example = remove_adjacent(example)
print example
""" Output:
['berry', '||', 'pancake']
"""
ちなみにこれは リストから隣接する重複要素を削除する の繰り返しです