20

内側のループから外側のイテレータをインクリメントするにはどうすればよいですか?

より正確には:

  for i in range(0,6):
    print i
    for j in range(0,5):
      i = i+2

私は得ています

0
1
2
3
4
5

、 でも私はしたい0,2,4

上記は、私が達成したい単純化されたアイデアです。

これが私のJavaコードです:

str1="ababa"
str2="aba"
for(int i =0; i < str1.length; i++)
  for(int j =0; j < str2.length; j++)
       if str1[i+j]!=str[j]
           break;
       if( j ==str2.length -1)
           i=i+str2.length;
4

5 に答える 5

21

範囲関数のステップパラメータを使用したいようです。ドキュメントから:

range(start、stop [、step])これは、等差数列を含むリストを作成するための用途の広い関数です。これは、forループで最もよく使用されます。引数は単純な整数でなければなりません。step引数を省略すると、デフォルトで1になります。start引数を省略すると、デフォルトで0になります。完全な形式は、単純な整数のリストを返します[start、start + step、start + 2 * step、...] 。stepが正の場合、最後の要素は最大の開始+i*停止よりも小さいステップです。stepが負の場合、最後の要素は、stopよりも大きいstart +i*ステップの最小値です。ステップはゼロであってはなりません(そうでない場合、ValueErrorが発生します)。例:

 >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> range(1, 11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 >>> range(0, 30, 5) [0, 5, 10, 15, 20, 25]
 >>> range(0, 10, 3) [0, 3, 6, 9]
 >>> range(0, -10, -1) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
 >>> range(0) []
 >>> range(1, 0) []

[0,2,4]を取得する場合は、次を使用できます。

range(0,6,2)

または、あなたの場合、はvarです:

idx = None
for i in range(len(str1)):
    if idx and i < idx:
        continue
    for j in range(len(str2)):
        if str1[i+j] != str2[j]:
            break
    else:
        idx = i+j
于 2012-11-16T04:43:15.363 に答える
10

このためのforループよりも、whileループを使用した方がよい場合があります。私はあなたのコードをJavaコードから直接翻訳しました。

str1 = "ababa"
str2 = "aba"
i = 0

while i < len(str1):
  j = 0
  while j < len(str2):
    if not str1[i+j] == str1[j]:
      break
    if j == (len(str2) -1):
      i += len(str2)
    j+=1  
  i+=1
于 2012-11-16T05:11:20.253 に答える
6

Pythonでは、forループはカウンターをインクリメントするのではなく、反復可能オブジェクトを反復処理するため、いくつかの選択肢があります。Artsiomが推奨するようなスキップフラグを使用することは、それを行う1つの方法です。別のオプションは、範囲からジェネレーターを作成し、を使用して要素を破棄することによって手動でそれを進めることnext()です。

iGen = (i for i in range(0, 6))
for i in iGen:
    print i
    if not i % 2:
        iGen.next()

next()ただし、範囲の終わりに達するとStopIterationがスローされる可能性があるため、これは完全ではありません。そのため、それを検出し、発生した場合は外部ループから抜け出すためのロジックを追加する必要があります。

結局、私はおそらくwhileループを使用したaw4ullyのソリューションを使用するでしょう。

于 2012-11-16T05:16:02.507 に答える
3

私は上記のすべての答えを読みました、そしてそれらは実際に良いです。

このコードを見てください:

for i in range(1, 4):
    print("Before change:", i)
    i = 20 # changing i variable
    print("After change:", i) # this line will always print 20

上記のコードを実行すると、出力は次のようになります。

Before Change: 1
After change: 20
Before Change: 2
After change: 20
Before Change: 3
After change: 20

Pythonでは、forループは値を増やそうとはしていませんi。forループは、指定した値を割り当てるだけですirange(4)私たちが行っていることを使用して、iに割り当てる必要のあるforループに値を与えます。

あなたが望むことを同じことをするwhile loop代わりに使うことができます、for loop

i = 0
while i < 6:
    print(i)
    j = 0
    while j < 5:
        i += 2 # to increase `i` by 2

これは、

0
2
4

ありがとうございました !

于 2019-10-12T04:55:37.213 に答える
0
for a in range(1):

    for b in range(3):
        a = b*2
        print(a)

あなたの質問によると、あなたは内側のループの助けを借りて外側のループを繰り返したいと思います。

  1. 外側のループでは、内側のループを1回繰り返しています。
  2. 内側のループでは、0から始めて2の倍数である3桁を繰り返しています。

    Output:
    0
    2
    4
    
于 2019-10-12T04:22:43.647 に答える