получать перестановки без повтора, когда это ненужно - PullRequest
1 голос
/ 14 октября 2019

Как можно получить все перестановки элементов во вложенном списке, не повторяя, когда это не нужно. Например, если у меня есть вложенный список:

[['a1','a2','a3'], ['b1', 'b2'], ['c1', 'c2', 'c3', 'c4']]

Я хочу получить:

['a1', 'b1', 'c1']
['a2', 'b2', 'c2']
['a3', 'b1', 'c3']
['a1', 'b2', 'c4']

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Вы можете использовать zip() и itertools.cycle():

from itertools import cycle

src = [['a1','a2','a3'], ['b1', 'b2'], ['c1', 'c2', 'c3', 'c4']]
res = list(zip(*map(lambda x, m=max(src): cycle(x) if x != m else x, src)))

Используя max(), мы находимэлемент с максимальной длиной и применяется cycle() ко всем элементам списка, кроме этого ( с максимальной длиной ). Затем мы распаковываем результаты в zip() и получаем то, что вам нужно.

Если вы хотите напечатать результат в точном формате из вопроса, используйте следующий код:

print(*map(list, zip(*map(lambda x, m=max(src): cycle(x) if x != m else x, src))), sep="\n")
0 голосов
/ 14 октября 2019

Я думаю, что вы ищете это то, что вы написали, itertools.product

itertools.product((*[['a1','a2','a3'], ['b1', 'b2'], ['c1', 'c2', 'c3', 'c4']])) # ->

"""
[('a1', 'b1', 'c1'),
 ('a1', 'b1', 'c2'),
 ('a1', 'b1', 'c3'),
 ('a1', 'b1', 'c4'),
 ('a1', 'b2', 'c1'),
 ('a1', 'b2', 'c2'),
 ('a1', 'b2', 'c3'),
 ('a1', 'b2', 'c4'),
 ('a2', 'b1', 'c1'),
 ('a2', 'b1', 'c2'),
 ('a2', 'b1', 'c3'),
 ('a2', 'b1', 'c4'),
 ('a2', 'b2', 'c1'),
 ('a2', 'b2', 'c2'),
 ('a2', 'b2', 'c3'),
 ('a2', 'b2', 'c4'),
 ('a3', 'b1', 'c1'),
 ('a3', 'b1', 'c2'),
 ('a3', 'b1', 'c3'),
 ('a3', 'b1', 'c4'),
 ('a3', 'b2', 'c1'),
 ('a3', 'b2', 'c2'),
 ('a3', 'b2', 'c3'),
 ('a3', 'b2', 'c4')]
"""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...