使用反向范围变量的嵌套循环

时间:2016-05-04 12:15:27

标签: python range

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循环都将i修复为9。

为什么会出现此问题以及如何解决?

2 个答案:

答案 0 :(得分:4)

reversed生成迭代器,并且只能在耗尽之前迭代一次。你的内部循环尝试不止一次迭代r2,所以即使i经历了9到0,内部循环也只能产生一次实际数字。

在你的循环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()根据需要创建内部副本。

答案 1 :(得分:0)

您可以尝试其他方式来反转列表(因为reversed返回生成器 - 所以您只需迭代一次):

 

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

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

range(10)会返回一个列表,因此您可以使用slice [::-1]来回复该列表