последовательность переменных for in python - PullRequest
0 голосов
/ 16 июня 2020

Я начинаю программировать на python и столкнулся с проблемой, которую не знаю, как решить.

У меня есть вложенная функция for s, где количество вложенных for s зависит от входного параметра, например, если у меня входной параметр установлен на 2, я должен иметь:

for loop1 in range (0, limit):
   for loop2 in range (0, limit):
      print ('loop1: {} loop2: {}'.format(loop1,loop2))

Если он установлен равным 3, я должен иметь:

for loop1 in range (0, limit):
   for loop2 in range (0, limit):
      for loop3 in range (0, limit):
         print ('loop1: {} loop2: {} loop3 {}'.format(loop1,loop2, loop3))

Результаты будут:

для 2:

0,0
0,1
1,0
1,1

для 3:

0,0,0
0,0,1
0,1,0
1,0,0
...
2,2,2

И так далее.

Кто-нибудь знает, как это сделать?

Ответы [ 4 ]

3 голосов
/ 16 июня 2020

Вы можете использовать itertools.product с аргументом repeat для создания этих последовательностей.

from itertools import product

def gen_sequence(limit):
    for vals in product(range(limit), repeat=limit):
        print(','.join(str(i) for i in vals))

Пример

>>> gen_sequence(2)
0,0
0,1
1,0
1,1

>>> gen_sequence(3)
0,0,0
0,0,1
0,0,2
...
2,2,0
2,2,1
2,2,2
2 голосов
/ 16 июня 2020

Это называется декартовым произведением и доступно в Python через itertools.product

import itertools

for i in itertools.product(range(3), repeat=3):
    print(i)

Чтобы указать много, вы можете просто ввести несколько итераторов.

for i in itertools.product(range(1), range(2), range(3)):
    print(i)
1 голос
/ 16 июня 2020

Вы можете:

import itertools

for i in itertools.product(list(range(x)), repeat=x):
    print(','.join(i), end=' ')

itertools.product возвращает все продукты в диапазоне от 0 до x - 1, затем вы присоединяетесь и печатаете их.

0 голосов
/ 16 июня 2020

Похоже, что-то, что нужно решить с помощью рекурсивной функции. что-то вроде:

def loops(n,limit):
    for loop in range (0, limit):
        n-=1
        row = [loop]
        if n == 1:
            ...
        else:    
            row = row + loops(n,limit)

У меня не было времени на тонкую настройку, но вы поняли. Если нет, изучите рекурсивные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...