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

时间:2019-03-26 13:02:20

标签: python for-loop

我知道这似乎很简单而且很简单,很抱歉,如果我在浪费每个人的时间,但是我被困住了,已经有几个小时了。

我有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

请记住,如图所示,我确实需要这四个循环。

我应该在印刷品中放入什么?我现在觉得很愚蠢,因为这似乎是一个简单的数学问题,但我似乎无法找出解决方案。 非常感谢。

编辑:回答所有评论,让我说:

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上进行的操作才能得到我的结果。我希望它更清晰一些。

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

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

假设您的循环有这么多循环:

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)

答案 2 :(得分:0)

一个简单的解决方案(采用您正在执行的格式)将是:

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

打印使用cstyle格式,其中%d是整数%s是字符串等,并且%之后的参数中包含了子元素。

这将产生:

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)

答案 3 :(得分:0)

我想更简单的方法是:

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, 3)来代替(1,4)

答案 4 :(得分:0)

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

>>> 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

如果您确实不需要丑陋的4+级嵌套itertools.product循环(如果您要舍弃可迭代对象中的值而只想计数),那么for会更好: / p>

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