2016-05-04 8 views
1
for i in reversed(range(10)): 
    for j in reversed(range(10)): 
     print(i, j) 

変数を使用してこのPythonコードを変更したいと思います。反転範囲変数を使用したネストループ

r = reversed(range(10)) 
for i in r: 
    for j in r: 
     print(i, j) 

r1 = reversed(range(10)) 
r2 = reversed(range(10))  
for i in r1: 
    for j in r2: 
     print(i, j) 

はしかし、forループ上記の両方が9

iを修正なぜこの問題が発生したか、どのように私はそれを修正することができますか?

答えて

4

reversedは、イテレータを生成し、消耗する前に1回だけ反復することができます。しかし、内部ループはr2を2回以上反復しようとします。したがって、iが9まで0になる場合でも、内部ループは実際の数値を1回しか生成できません。

再作成jあなたのループ内のイテレータ:

r1 = reversed(range(10)) 
for i in r1: 
    r2 = reversed(range(10))  
    for j in r2: 
     print(i, j) 

または複数回にわたり反復することができ、最初のリストのコピーを作成します。

r1 = reversed(range(10)) 
r2 = reversed(range(10)) 
r2_copy = list(r2) 
for i in r1: 
    for j in r2_copy: 
     print(i, j) 

より良い代替手段を使用することですitertools.product() function

from itertools import product 

r1 = reversed(range(10)) 
r2 = reversed(range(10)) 
for i, j in product(r1, r2): 
    print(i, j) 

product()は、必要に応じて内部コピーを作成します。

0

あなたはリストを逆転するためにいくつかの他の方法を試みることができる(reversedリターン・ジェネレータとして - あなたは一度だけ、それを反復処理することができるように):

r = range(10)[::-1]

for i in r: for j in r: print(i, j)

range(10)ので、リストを返します。 slice [::-1] を使用してそれを反駁することができます
関連する問題