Мне нужно найти все возможные перестановки и комбинации заданных элементов без повторения одних и тех же пар.
Например
list = [a,b,c]
Желаемый результат
[(a),(b),(c),(a,b),(a,c),(b,a),(b,c),(c,a),(c,b),(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)]
Я пробовал itertools
в python, чтобы получить те же пары выходных данных, но потерпел неудачу.
Используя itertools.permutations
вывод был
[abc,acb,bac,bca,cab,cba]
Используя itertools.combinations
вывод был
[(), ('a',), ('b',), ('c',), ('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')]
который пропустил такие пары, как (b,a)
.
Использование itertools.combinations_with_replacement
дает повторяющиеся элементы в паре, например. (a,a,a),(b,b,b)
, что недопустимо.
Желаемый результат не должен содержать повторяющихся парных элементов.
answer = set()
L = ['a', 'b', 'c']
for i in range(len(L)+1):
for c in itertools.combinations(L, i):
for p in itertools.permutations(c):
answer.add(p)
In [288]: answer
Out[288]:
{(),
('a',),
('a', 'b'),
('a', 'b', 'c'),
('a', 'c'),
('a', 'c', 'b'),
('b',),
('b', 'a'),
('b', 'a', 'c'),
('b', 'c'),
('b', 'c', 'a'),
('c',),
('c', 'a'),
('c', 'a', 'b'),
('c', 'b'),
('c', 'b', 'a')}
@ShadowRanger: о да! Спасибо за напоминание. Ясно, кофе не работает ;)
permutations
позволяет указать длину списка перестановок:
Если вы включите нулевой набор:
permlist = []
for i in range(len(mylist) + 1):
permlist += itertools.permutations(mylist, i)
Если исключить нулевой набор:
permlist = []
for i in range(len(mylist)):
permlist += itertools.permutations(mylist, i+1)
Вам не нужны ни три петли, ни
set
(она не создает дубликатов). Просто инициализируйтеanswer = []
и замените два внутренних цикла наfor p in itertools.permutations(L, i): answer.append(p)
. Все полноразмерные перестановки всех комбинаций заданной длины уже эквивалентны всем перестановкам заданной длины.