15

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

代わりに ['berry','||','pancake'] を使用してください。

ありがとう!

4

8 に答える 8

42

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

後者の場合、ループはループと同じようにforサポートされます。continuewhile

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 からやり直します。

于 2010-09-13T22:44:17.087 に答える
25
while True:
    for i in xrange(10):
        if condition(i):
            break
    else:
        break

それはあなたが望むように見えるでしょう。なぜそれをやりたいのかは別問題です。おそらく、コードを見て、それを行うための明白で簡単な方法を見落としていないことを確認する必要があります。

于 2010-09-13T22:44:56.393 に答える
5

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

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

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

そして、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'] ) )
于 2010-09-13T22:56:44.503 に答える
4

それがちょうど私に来たので、避けられない 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'])]
于 2010-09-13T23:26:07.473 に答える
3

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

于 2010-09-13T22:37:48.017 に答える
3

continueforループでも機能します。

>>> 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
于 2010-09-13T22:39:05.280 に答える
1

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

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

L = ['berry','||','||','||','pancake']
idx=1
while idx<len(L):
    if L[idx-1]==L[idx]:
        del L[idx]
    else:
        idx+=1
于 2010-09-13T23:45:07.490 に答える
0
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']
"""

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

于 2010-09-13T23:32:55.747 に答える