web-dev-qa-db-ja.com

Python forループ質問

私はPythonで次のことを達成する方法を疑問に思っていました:

for( int i = 0; cond...; i++)
  if cond...
    i++; //to skip an run-through

運よくこれを試しました。

for i in range(whatever):
  if cond... :
    i += 1
26
Joe Dunk

Pythonのforループは異なります。 iは、ループを通過するたびに次の値に再割り当てされます。

以下は、C++が行っていることのリテラルバージョンを取得しているため、必要な処理を行います。

i = 0
while i < some_value:
    if cond...:
        i+=1
    ...code...
    i+=1

その理由は次のとおりです。

c ++では、次のコードセグメントは同等です。

for(..a..; ..b..; ..c..) {
    ...code...
}

そして

..a..
while(..b..) {
     ..code..
     ..c..
}

一方、python forループは次のようになります。

for x in ..a..:
    ..code..

になる

my_iter = iter(..a..)
while (my_iter is not empty):
    x = my_iter.next()
    ..code..
40
jakebman

現在の反復をスキップして次の反復に進むcontinueキーワード(およびすべてのループ反復をスキップしてループを終了するbreakキーワード)があります。

for i in range(10):
    if i % 2 == 0:
      # skip even numbers
      continue 
    print i
11
tux21b

イテレータを明示的にインクリメントできます。

whatever = iter(whatever)
for i in whatever:
    if cond:
        whatever.next()

Condが最後の要素でTrueになる可能性がある場合は、StopIterationをキャッチする必要があります。

4
user97370

リスト内の要素を繰り返し処理しているのであって、数字を繰り返し処理しているのではないことに注意してください。

たとえば、次のことを考慮してください。

for i in ["cat", "dog"]:
  print i

そこでi + 1を実行するとどうなりますか?リストの次の要素をスキップしない理由がわかりました。

実際にすべての値を反復処理する代わりに、反復処理するリスト内に含まれるものを調整することもできます。

例:

r = range(10)
for i in filter(lambda x: x % 2 == 0, r):
  print i

また、for本体を2つに分割することもできます。最初の部分はcontinueを使用して次の要素にスキップし、スキップしなかった場合は2番目の部分がアクションを実行します。

4
Brian R. Bondy

これには、達成しようとしているタスクに応じて、別のアプローチがあります。 condが完全にループしている入力データの関数である場合、次のようなものを試してみてください。

def check_cond(item):
    if item satisfies cond:
        return True
    return False

for item in filter(check_cond, list):
    ...

これは、C#3.0+のLINQのように、これを行うための関数型プログラミングの方法です。 Pythonic(しばらくの間、Guido van Rossumはフィルターを削除し、マップし、Python 3)から減らしたいと思っていましたが、それは確かにエレガントで、私がやる方法でした。 。

2
Clueless

簡単に「次のレッグをスキップ」することはできません(もちろん、thisレッグをcontinueでスキップできます)。あなたが本当に主張するなら、あなたは補助的なboolでそれを行うことができます。

skipping = False
for i in whatever:
  if skipping:
    skipping = False
    continue
  skipping = cond
  ...

または、補助的なintを使用して一般化する場合:

skipping = 0
for i in whatever:
  if skipping:
    skipping -= 1
    continue
  if badcond:
    skipping = 5  # skip 5 legs
  ...

ただし、このような複雑なループロジックを適切なジェネレーターにカプセル化することをお勧めします-希望するものについてもう少し具体的にできる場合を除き、例を挙げるのは困難です(おそらく、同じブール値condを追うのは本当に難しい;-)。

1
Alex Martelli
for i in filter(lambda x:x!=2,range(5)):
0
Luka Rahne