Комбинации списка списка - Поэлементно - PullRequest
0 голосов
/ 21 марта 2019

Я ищу метод для генерации всех возможных комбинаций списка списков при условии, что должны быть только «поэлементные» комбинации. Таким образом, если у нас есть списки [1,2] и [3,4], то результат [3,2] разрешен, но [4,2] не разрешен. С itertools.product (* lists) включается последний результат.

Таким образом, я хочу следующий вывод: [1,2], [3,2], [1,4], [3,4], и следующие опции должны быть пропущены: [4,2] , [1,3]. Обратите внимание, что порядок важен! Таким образом, я не допускаю [2,3], просто [3,2].

Я знаю, что могу проверить это потом, но так как я генерирую много-много списков в своем коде, я скорее избегаю этого.

1 Ответ

2 голосов
/ 21 марта 2019

Вы можете сохранить два списка в одном списке, а затем после транспонирования списка контейнеров использовать itertools.product() для него.

import itertools
original_list =  [[1,2], [3,4]]
transposed_list = list(map(list, zip(*original_list)))
print(list(itertools.product(*transposed_list)))

Выходы: [(1, 2), (1, 4), (3, 2), (3, 4)]

РЕДАКТИРОВАТЬ |Объяснение того, как был транспонирован список:

По определению, транспонирование - это процесс обмена местами.

*original_list означает [1,2] и [3,4].Звездочка относится к элементам списка, а не к списку в целом

zip в основном объединяет значения «поэлементно»: например, с нашими original_list у нас есть [1,2] и [3,4].Вызов zip для наших элементов приведет к (1,3) и (2,4).Значения были спарены поэлементно.Обратите внимание, что полученные пары не представлены в виде списка.

map применяет функцию к каждому элементу входного списка.В нашем примере мы хотим применить (встроенную) функцию list к нашим поэлементным парам - т.е. преобразовать каждый кортеж пар в список.Это то, что превращает (1,3) и (2,4) в [1,3] и [2,4]

Наконец, преобразуйте наш результат из отображения в содержащий список, удерживая наши поэлементные пары, получая [ [1,3], [2,4] ]

...