Python: печать числовых последовательностей из вложенных циклов - PullRequest
0 голосов
/ 26 марта 2019

Я знаю, что это кажется очень простым и легким, и мне жаль, что я теряю время всех, но я застрял, и прошло уже несколько часов.

У меня есть 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, чтобы получить мои результаты.Я надеюсь, что это немного яснее.

Ответы [ 5 ]

1 голос
/ 26 марта 2019

(Да, счетчик может быть проще в большинстве случаев, но это круче!)

Вам необходимо знать количество выходов, которые происходят за итерацию каждого цикла.

Предполагаяу ваших циклов много циклов:

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) в формуле.

1 голос
/ 26 марта 2019

Во-первых, есть прямой и прямой путь:

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

(Или вы меняете цифры иendian-ness).

Итак, вы можете сделать

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)
0 голосов
/ 26 марта 2019

Еще один способ сделать это - использовать генератор:

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

itertools.product еще лучше, если вам не нужны страшные 4+ уровня вложенных циклов for (если вы отбрасываете значения в итерируемых элементах и ​​просто хотите считать):

>>> for i, _ in enumerate(product(range(3), range(2))):
        print(i+1)
1
2
3
4
5
6
0 голосов
/ 26 марта 2019

Я думаю, что более простой способ:

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, или вместо (1, 3) вы должны написать (1,4), если хотите, чтобы ваш цикл повторялся 3 раза.

0 голосов
/ 26 марта 2019

Простое решение (в том формате, в котором вы это делаете):

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...