Подтвердить что ты не робот

Python объединяет два списка со всеми возможными перестановками

Я пытаюсь найти лучший способ объединить два списка во все возможные комбинации. Итак, если я начну с двух списков, например:

list1 = [1, 2]
list2 = [3, 4]

Полученный список будет выглядеть следующим образом:

[[[1,3], [2,4]], [[1,4], [2,3]]]

То есть, он в основном создает список списков со всеми возможными комбинациями между ними.

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

list1 = [1, 2, 3, 4]
list2 = [5, 6, 7, 8]
print list(itertools.product(list1, list2))

Что получилось:

[(1, 5), (1, 6), (1, 7), (1, 8), (2, 5), (2, 6), (2, 7), (2, 8), (3, 5), (3, 6), (3, 7), (3, 8), (4, 5), (4, 6), (4, 7), (4, 8)]

Таким образом, он делает все возможные комбинации элементов в каждом списке, но не все возможные результирующие списки. Как мне это добиться?

EDIT: конечной целью является возможность индивидуально обрабатывать каждый список для определения эффективности (фактические данные, с которыми я работаю, более сложны). Итак, в исходном примере выше это будет работать примерно так:

list1 = [1, 2]
list2 = [3, 4]

Get first merged list: [[1,3], [2, 4]]
    Do stuff with this list
Get second merged list: [[1,4], [2, 3]]
    Do stuff with this list

Если я получил вывод "список списков списков", описанный выше, я мог бы поместить его в цикл for и обработать. Другие формы вывода будут работать, но с ними, пожалуй, проще всего работать.

4b9b3361

Ответ 1

repeat первый список, permutate второй и zip все вместе

>>> from itertools import permutations, repeat
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> list(list(zip(r, p)) for (r, p) in zip(repeat(a), permutations(b)))
[[(1, 4), (2, 5), (3, 6)],
 [(1, 4), (2, 6), (3, 5)],
 [(1, 5), (2, 4), (3, 6)],
 [(1, 5), (2, 6), (3, 4)],
 [(1, 6), (2, 4), (3, 5)],
 [(1, 6), (2, 5), (3, 4)]]

EDIT. Как отметил Питер Оттен, внутренние zip и repeat являются излишними.

[list(zip(a, p)) for p in permutations(b)]

Ответ 2

Принятый ответ можно упростить до

a = [1, 2, 3]
b = [4, 5, 6]
[list(zip(a, p)) for p in permutations(b)]

(Вызов List() может быть опущен в Python 2)

Ответ 3

Попробуйте использовать генератор списков для создания вложенных списков:

>>> [[[x,y] for x in list1] for y in list2]
[[[1, 3], [2, 3]], [[1, 4], [2, 4]]]
>>>

Или, если вам нужен однострочный список, просто удалите скобки:

>>> [[x,y] for x in list1 for y in list2]
[[1, 3], [1, 4], [2, 3], [2, 4]]

Ответ 4

Отредактировал мой код, чтобы дать вам желаемый результат.

list1 = [1,2]
list2 = [3,4]
combined = []

for a in list1:
    new_list = []
    for b in list2:
        new_list.append([a, b])
    combined.append(new_list)

print combined

Ответ 5

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

lst1 = [1,2]
lst2 = [3,4]

#lst = [[j,k] for j in lst1 for k in lst2] # [[1,3],[1,4],[2,3],[2,4]]
lst = [[[j,k] for j in lst1] for k in lst2] # [[[1,3],[2,3]],[[1,4],[2,4]]]
print lst

Ответ 6

Попробуйте следующее:

combos=[]
for i in list1:
      for j in list2:
          combos.append([i,j])
print combos

Ответ 7

Поскольку ответ @pacholik не охватывает списки разной длины, вот мое решение, используя понимание списка с двумя переменными:

first_list = [1, 2, 3]
second_list = ['a', 'b']

combinations = [(a,b) for a in first_list for b in second_list]

Результат выглядит следующим образом:

[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]