Как я могу получить декартово произведение (каждую возможную комбинацию значений) из группы списков?
Входные данные:
somelists = [
[1, 2, 3],
['a', 'b'],
[4, 5]
]
Желаемый вывод:
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5) ...]
set(cartesian product)
set(inputlist)
над всеми вашими входными списками. Не на результат.Ответы:
itertools.product
Доступно с Python 2.6.
Что так же, как,
источник
product()
генерируетnitems_in_a_list ** nlists
элементы в результате (reduce(mul, map(len, somelists))
). Нет оснований полагать, что получение одного элемента не являетсяO(nlists)
(амортизированным), т. Е. Сложность по времени такая же, как и для простых вложенныхfor
циклов, например, для ввода в вопросе:,nlists=3
общее количество элементов в результате:3*2*2
и каждый элемент имеетnlists
элементы (3
в данном случае).*
списков? Что оно делает?источник
Для Python 2.5 и старше:
Вот рекурсивная версия
product()
(просто иллюстрация):Пример:
источник
args
являются итераторами.с itertools.product :
источник
*
списков?Я хотел бы использовать список понимания:
источник
Вот рекурсивный генератор, который не хранит никаких временных списков
Вывод:
источник
def f(): while True: yield 1
будет продолжать увеличивать размер своего стека по мере его прохождения?В Python 2.6 и выше вы можете использовать itertools.product. В старых версиях Python вы можете использовать следующий (почти - см. Документацию) эквивалентный код из документации , по крайней мере, в качестве отправной точки:
Результатом обоих является итератор, поэтому, если вам действительно нужен список для дальнейшей обработки, используйте
list(result)
.источник
Хотя ответов уже много, я хотел бы поделиться некоторыми своими мыслями:
Итеративный подход
Рекурсивный подход
Лямбда-подход
источник
Рекурсивный подход:
Итерационный подход:
источник
Незначительная модификация вышеупомянутого рекурсивного генераторного решения в вариационном аромате:
И, конечно, оболочка, которая заставляет его работать точно так же, как это решение:
с одним компромиссом : он проверяет, должна ли рекурсия прерываться на каждом внешнем цикле, и один выигрыш : нет выхода при пустом вызове, например
product(())
, что, я полагаю, будет семантически более правильным (см. doctest).Что касается понимания списка: математическое определение применяется к произвольному числу аргументов, в то время как понимание списка может иметь дело только с известным числом из них.
источник
Просто чтобы добавить немного к тому, что уже было сказано: если вы используете sympy, вы можете использовать символы, а не строки, что делает их математически полезными.
О симпы .
источник
Я считаю, что это работает:
источник
Подход Стоунхенджа:
вывод:
источник