Python :从嵌套循环打印数字序列



我知道这看起来非常基本和简单,如果我浪费了大家的时间,我很抱歉,但我被困住了,现在已经几个小时了。

有 4 个循环,最后我必须打印从 1 到末尾的所有数字。看到代码后会很清楚:

for a in range (0,7):
    for b in range (1,118):
        for c in range (0,7):
            for d in range (1,118):
                print(...)

我的期望是:

1
2
3
...
383292

其中383292=118*118*7*4

请记住,我真的需要这 4 个循环,因为它们如图所示。

我应该在打印件里放什么?我现在觉得很愚蠢,因为这似乎是一个简单的数学问题,但我似乎无法找出解决方案。多谢。

编辑:要回答所有评论,假设我有这个:

for a in range (0,2):
    for b in range (1,3):
        for c in range (0,2):
            for d in range (1,3):
                print(...)

我想作为输出:

1
2
3
...
24

我需要找到一些操作来对a,b,c和d进行才能获得结果。我希望它更清楚一点。

(是的,在大多数情况下计数器可能更容易,但这更酷!

您需要知道每个循环的每次迭代发生的输出量。

假设您的循环有这么多个周期:

cycles_a = 7
cycles_b = 117
cycles_c = 4
cycles_d = 117

你有输出:

outputs_d = 1
outputs_c = outputs_d * cycles_d
outputs_b = outputs_c * cycles_c
outputs_a = outputs_b * cycles_b

如果运行此循环:

for a in range(0,cycles_a):
    for b in range(0,cycles_b):
        for c in range(0,cycles_c):
            for d in range(0,cycles_d):
                print(d*outputs_d + c*outputs_c + b*outputs_b + a*outputs_a)

您将打印:

0
1
...
<7*117*4*117 - 1>

如果要从打印 1 开始,请在公式中添加一个。

如果范围从 1 而不是 0 开始,请在公式中使用 (a-1)/(b-1)/(c-1)/(d-1)

首先,有直接直接的方法:

counter = 1
for a in range (0,7):
    for b in range (1,118):
        for c in range (0,7):
            for d in range (1,118):
                print(counter)
                counter += 1

如果我们不想这样做,那么我们可能会注意到,就好像你在混合基数(而不是基数 10(中写一个数字。看起来你的号码是这样的

A B C D
| | | |__ base 118
| | |____ base 7
| |______ base 118
|________ base 7

要将数字从这个混合基数转换为基数 10,您需要这样做

def convert(a, b, c, d):
    return d + 7 * c + 118 * 7 * b + 7 * 118 * 7 * a

(或者你颠倒数字和字节序(。

所以你可能会做

for a in range (0,7):
    for b in range (118):
        for c in range (0,7):
            for d in range (118):
                print(d + 7 * c + 118 * 7 * b + 7 * 118 * 7 * a)
一个简单的

解决方案(以您正在执行的格式(是:

counter = 0 
myrange = lambda x: range(1,x+1)
for a in myrange(118):
    for b in myrange(118):
        for c in myrange(7):
            for d in myrange(4):
                counter+= 1 
                print('counter %d gives: %d = %d * %d * %d * %d'%(counter,a*b*c*d,a,b,c,d))

myrange运行一个从 1 开始到以 x <maxnum+1(即您的最大数字(结束的命令。>

打印使用 cstyle 格式,其中 %d 是整数%s是字符串等,并在 % 之后的参数中使用 subs。

这会产生:

counter 1 gives: 1 = 1 * 1 * 1 * 1
...
counter 389869 gives: 97468 = 118 * 118 * 7 * 1
counter 389870 gives: 194936 = 118 * 118 * 7 * 2
counter 389871 gives: 292404 = 118 * 118 * 7 * 3
counter 389872 gives: 389872 = 118 * 118 * 7 * 4

或者,您可以将值保存在列表中,并一次打印一个。

myrange = lambda x: range(1,x+1)
output=[]
for a in myrange(118):
    for b in myrange(118):
        for c in myrange(7):
            for d in myrange(4):
                output.append(a*b*c*d)
for i in output:
   print(i)

这给出了:

1
...
250632
334176
97468
194936
292404
389872

如果您需要值的大小,您可以这样做

output.sort()
for i in output:
   print(i)
我想

更简单的方法是:

res = 0
for a in range (0,2):
    for b in range (1,3):
        for c in range (0,2):
            for d in range (1,3):
                res += 1
                print(res)

但它最多打印 16 个数字,而不是 24 个。你应该从 0 开始计数到 n,或者如果你想让你的周期重复 3 次,你应该写(1,4)而不是(1, 3)

另一种方法是使用生成器:

>>> def infinite_counter(n=0):
        while True:
            n += 1
            yield n
>>> counter = infinite_counter()
>>> for i in range(3):
       for j in range(2):
           print(next(counter))
1
2
3
4
5
6

如果您真的不需要嵌套for循环的丑陋的 4+ 级别,则itertools.product更好(如果您要丢弃可迭代对象中的值并且只想计数(:

>>> for i, _ in enumerate(product(range(3), range(2))):
        print(i+1)
1
2
3
4
5
6

最新更新