web-dev-qa-db-ja.com

Python-whileループの「続行」と同様に、forループを再開する方法は?

基本的に、特定の条件が満たされた場合にアクションを実行した後、制御を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]がリスト内にある場合、次のようになります。

代わりに['ベリー'、 '||'、 'パンケーキ']。

ありがとう!

10
Georgina

「再起動」とはどういう意味かわかりません。最初から繰り返しを開始しますか、それとも単に現在の繰り返しをスキップしますか?

後者の場合、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からやり直します。以下同様に無期限に続きます(本当に良い例ではありません、私は知っています)。

34
Liquid_Fire
while True:
    for i in xrange(10):
        if condition(i):
            break
    else:
        break

それはあなたが望むように見えることをするでしょう。なぜそれをやりたいのかは別の問題です。たぶん、あなたはあなたのコードを見て、あなたがそれをするための明白でより簡単な方法を見逃していないことを確認するべきです。

25
nmichaels

プロセス全体を再構築するいくつかのアクション

アルゴリズムを考えるのに悪い方法。

フィルタリングしているだけです。つまり、重複を削除しています。

そして-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'] ) )
5
S.Lott

それがちょうど私に来たので、避けられない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'])]
4
Jochen Ritzel

Continueはどのループでも機能します。

3
volting

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
3
Sam Dolan

ご覧のとおり、質問に答えると、かなり複雑なコードになります。通常、より良い方法を見つけることができます。そのため、そのような構造は言語に組み込まれていません。

Itertoolsの使用に慣れていない場合は、代わりにこのループの使用を検討してください。 forループを再起動するよりも追跡が簡単であるだけでなく、すでに渡されたアイテムを再チェックする時間を無駄にしないため、より効率的です。

L = ['berry','||','||','||','pancake']
idx=1
while idx<len(L):
    if L[idx-1]==L[idx]:
        del L[idx]
    else:
        idx+=1
1
John La Rooy
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']
"""

ちなみにこれは リストから隣接する重複要素を削除する の繰り返しです

0