используя результат itertools.product несколько раз - PullRequest
0 голосов
/ 13 октября 2019

Я использую itertools.product в его обычной форме для генерации списка кортежей.

Затем я перебираю список со стандартным циклом for i in myList: для получения желаемых результатов.

Iзатем хотите выполнить итерацию во второй раз по тому же циклу, используя for i in myList:, но он не выполнит второй цикл без моей регенерации myList до входа в цикл.

Почему это так?

Я посмотрел на справку по itertools в документации по python, которая объясняет, что делает itertools.product (), но не объясняет, почему пользователь должен вызывать ее перед каждой записью цикла.

https://docs.python.org/2/library/itertools.html#itertools.product

import itertools as it


def loopsThings(*lsts):


    # list of possibilities
    allPossible = it.product(a, b, c)

    for i in allPossible:
        print('first pass', i)

    # list of possibilities
    # second pass works if this is un-commented !!
    # allPossible = it.product(a, b, c) 

    for i in allPossible:
        print('second pass', i)

    return


a = [3, 5, 10]
b = [1, 9, 15]
c = [4, 8]

loopsThings(a, b, c)

я ожидаю получить 2 списка, но получу только 1 список (first pass)

, чтобы получить второй список, мне нужно запустить allPossible = it.product(a, b, c) перед входомвторой петли.

Ответы [ 2 ]

4 голосов
/ 13 октября 2019

itertools.product возвращает <class 'itertools.product'>. Вам нужно составить список всего возможного, чтобы получить ожидаемый результат.

import itertools as it


def loopsThings(*lsts):


    # list of possibilities
    allPossible = list(it.product(a, b, c))

    for i in allPossible:
        print('first pass', i)

    # list of possibilities
    # second pass works if this is un-commented !!
    # allPossible = it.product(a, b, c) 

    for i in allPossible:
        print('second pass', i)

    return


a = [3, 5, 10]
b = [1, 9, 15]
c = [4, 8]

loopsThings(a, b, c)
1 голос
/ 13 октября 2019

Используя предыдущие комментарии:

Это ответ:

Некоторые стандартные библиотечные функции Python, такие как объекты итератора возврата продукта, предназначены только для одноразовой итерации. Внутренне они похожи на указатель, который указывает на элемент в связанном списке, который перемещается вверх один раз при каждом получении нового элемента (с помощью следующей функции).

Решение состоит в том, чтобы перейти от(одноразовый) объект allPossible = it.product(a, b, c) в список (с использованием работ по пониманию списка) allPossible = [x for x in it.product(a, b, c)]

...