2017-12-27 46 views
1

私がPythonで発見した1つの問題は、それぞれ独自のインデックスを持つ入れ子になったループを作成するのはあまりユーザーフレンドリーではないということです。Python:0から開始しないネストされたfor-loopsインデックスを持つ方法

は、どのように私はこのJavaコードのPythonの相当を記述します。私は前任者のネストされた各ループのためのカウンタ値を参照する方法を

for(int i = 0; i < array.length-2; i++){ 
    for(int j = i+1; j < array.length-1; j++){ 
     for(int k = j+1; k < array.length; k++){ 

注意してください。私が使用してみました:

for idx, val in enumerate(nums[:-2]):

をしかしidxは常に0で開始するのではなく前任者のインデックス値から開始されますように思えます。個別のカウンタ変数を維持する以外にも、より良い解決策がありますか?

+3

私はここでXYの問題をかぎます。あなたは何を解決しようとしていますか?多くの場合、異なる言語間に1-1のマッピングはありませんが(ここにあります)、Javaが提供していない同じ問題を解決するためのより良い方法があるかもしれません。 –

+4

参考までに、全く難しいことではありません。 (j + 1、len(arr)):... 'の範囲内のkについては、範囲内のjに対して(i + 1、len(arr) - 1) 'range 'でネストされたループを使うことはそれを行うための明白な方法でしょう。 –

+2

これは関連している可能性があります:https://stackoverflow.com/questions/41521725/iterating-over-multiple-indices-with-ijk-in-a-pythonicwayway –

答えて

1

それはrangeまたはxrangeを使用していることを行うことは非常に簡単です。あなたのやり方は次のとおりです。

Javaバージョン:

for(int i = 0; i < array.length-2; i++) { 
    for(int j = i+1; j < array.length-1; j++) { 
     for(int k = j+1; k < array.length; k++) { 

Pythonのバージョン:

for i in xrange(0,len(arr)-2): 
    for j in xrange(i+1, len(arr)-1): 
     for k in xrange(j+1, len(arr)): 

私はそれが役に立てば幸い!

2

簡単です。

for i in range(0,len(array)-2): 
    for j in range(i+1,len(array)-1): 
     for k in range(j+1,len(array)): 
      print k 
     print j 
    print i 
4
[Python]: enumerate(iterable, start=0)

から:

enumerate()によって返されるイテレータの__next__()方法は反復可能と繰り返し処理から得られた値(開始れる0にデフォルトから)カウントを含むタプルを返します。

例:

num = [0, 2, 4, 6, 8] 
start = 2 
for idx, val in enumerate(num[start:], start=start): 
    print("Index: {}, Element: {}".format(idx, val)) 

出力

Index: 2, Element: 4 
Index: 3, Element: 6 
Index: 4, Element: 8 
+0

私はこのバージョンに行くでしょう。間違ってはいけませんが、enumerateはイテレータを返します。これはリストよりも反復処理が速い(範囲によって返されます)。:) – IMCoins

+1

@IMCoins:* Py3 * 'range'はイテレータ(* Py2 *で' xrange'で利用できる動作)も返します。イテレータはリストより速いとは思わない(イテレータ値はその場で生成され、リストはすでにそこにある)、大きな利点はメモリ消費である。 – CristiFati