Вложенный l oop с itertools.product запускается только 1 раз - PullRequest
0 голосов
/ 19 апреля 2020

У меня тут небольшая проблема. Я пытаюсь сделать вложенный l oop, но второй l oop запускается только один раз.

Вот код:

def solver(numbers, gleichung_list = [], temp = []):
    perm = itertools.permutations(numbers)
    permlist = [list(y) for y in perm]
    oper = itertools.product(['+', '-', '*', '/'], repeat=len(numbers)-1)
    for gleichung in permlist:
        print(gleichung)
        for ops in oper:
            print(ops)
            temp = [None] * (len(numbers)*2-1)
            temp[::2] = list(gleichung)
            temp[1::2] = list(ops)
            print(temp)
            print(ops)

    numbers = [1, 2]
    solver(numbers)

Но когда я его запускаю вот что я получил:

[1, 2]
('+',)
[1, '+', 2]
('+',)
('-',)
[1, '-', 2]
('-',)
('*',)
[1, '*', 2]
('*',)
('/',)
[1, '/', 2]
('/',)
[2, 1]

Почему не запускается второй l oop?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Функция product() возвращает итератор, а не список, поэтому ваш вложенный l oop запускается один раз на этом итераторе, и элементов больше нет. Добавьте oper = list(oper) перед первым l oop, чтобы исправить эту проблему.

0 голосов
/ 19 апреля 2020

oper подошел к концу в первом прогоне l oop, и во втором прогоне ничего не осталось для повторения. Если вы просто переопределите oper в l oop, все будет в порядке.

def solver(numbers, gleichung_list = [], temp = []):
    perm = itertools.permutations(numbers)
    permlist = [list(y) for y in perm]
    for gleichung in permlist:
        oper = itertools.product(['+', '-', '*', '/'], repeat=len(numbers)-1)
        print(gleichung)
        for ops in oper:
            print(ops)
            temp = [None] * (len(numbers)*2-1)
            temp[::2] = list(gleichung)
            temp[1::2] = list(ops)
            print(temp)
            print(ops)
...