Все возможные варианты zip в Python

Например, у меня код выглядит следующим образом:

a = [1, 2]
b = [4, 5]

Как я могу получить что-то вроде этого:

[(1,4), (1,5), (2,4), (2,5)]

Подобно функции zip, но со всеми возможными вариантами. Или я не могу?

Ответы

Ответ 1

Вы хотите itertools.product:

>>> import itertools
>>> a = [1,2]
>>> b = [4,5]
>>> list(itertools.product(a,b))
[(1, 4), (1, 5), (2, 4), (2, 5)]

Ответ 2

Если вас интересует только результат, то itertools.product - это то, что вам нужно (+1 для @DSM для этого). Однако, если вас интересует алгоритм, который генерирует что-то вроде этого, он называется рекурсивный спуск. Алгоритм в этом случае будет работать следующим образом (я просто собираюсь распечатать результаты здесь для ясности):

def product(L, tmp=None):
    if tmp is None:
        tmp = []
    if L==[]:
        print tmp
    else:
        for i in L[0]:
            product(L[1:], tmp+[i])

Таким образом,

>>> product([[1,2], [4,5]])
[1, 4]
[1, 5]
[2, 4]
[2, 5]

Надеюсь, что это поможет

Ответ 3

Вы можете сделать это красиво со списком, или еще лучше с выражением генератора, если вам просто нужно выполнить итерацию с помощью комбинаций.

Здесь используется понимание списка:

a = [1, 2]
b = [4, 5]

[(i, j) for i in a for j in b]

И здесь с выражением генератора:

for pair in ((i, j) for i in a for j in b):
    print(pair)

Ответ 4

Не упускайте из виду очевидное:

out = []
for a in [1, 2]:
    for b in [4, 5]:
        out.append((a, b))

или список понятий:

a = [1, 2]
b = [4, 5]
out = [(x, y) for x in a for y in b]

Оба производят out == [(1, 4), (1, 5), (2, 4), (2, 5)]