Получить все комбинации списка в Python без повторения одного и того же символа дважды подряд - PullRequest
0 голосов
/ 21 ноября 2018

Много подобных вопросов задавалось ранее, но я не нашел такой же, как у меня.

Итак, допустим, у меня есть следующий список:

List = [1,2,3]

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

1
2
3
12
13
21
23
31
32
123
132
213
232
312
321

Как бы мне этого добиться?

Большинство решений дают следующие результаты:

1
2
3
12
13
32
123
132
213
232
312
321

Здесь 21,23 и 31 - этоотсутствует, так как я считаю, что 12, 32 и 13 считаются одинаковыми комбинациями, чего я не хочу, чтобы код делал.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Ужасно отвратительный однострочник, который, кажется, делает свое дело:

[
    int(''.join(map(str, number)))
    for n in range(1,4) 
    for number in itertools.product([1,2,3], repeat = n) 
    if not any([first == second for first, second in zip(number, number[1:])])
]

Выходы:

[1, 2, 3, 12, 13, 21, 23, 31, 32, 121, 123, 131, 132, 212, 213, 231, 232, 312, 313, 321, 323]

0 голосов
/ 21 ноября 2018

Я уверен, что это дубликат, но я не могу найти хорошего.itertools.permutations делает то, что вы хотите, когда вы перебираете все желаемые длины:

from itertools import permutations, chain

lst = [1,2,3]
list(chain(*(permutations(lst, n) for n in range(1, len(lst)+1))))
# [(1,), (2,), (3,), (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2), (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

или:

for p in chain(*(permutations(lst, n) for n in range(1, len(lst)+1))):
    print(''.join(map(str, p)))

1
2
3
12
13
21
23
31
32
123
132
213
231
312
321
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...