Уникальные перестановки списка от 2 до N в Python - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать список перестановок в al oop и распечатать для каждой итерации с выводом более двух (или записать в строки файла).

Пример списка ввода:

['one', 'two', 'three', 'four']

Требуемый вывод:

['one', 'two', 'three', 'four']
['two', 'three', 'four']
['one', 'three', 'four']
['one', 'two', 'four']
['one', 'two']
['one', 'three']
['one', 'four']
['two', 'three']
['two', 'four']
['three', 'four']

Это то, чем я управлял до сих пор (очень рано в моей Python жизни, прошу прощения):

from itertools import permutations

input = ['one', 'two', 'three', 'four']

def convertTuple(tup): 
    str =  ''.join(tup) 
    return str

while (len(input) > 1):    
    permlist = set(permutations(input))
    for i in permlist:
        print(i)
        i = convertTuple(i)
        outfile = open("out.txt", "w")
        outfile.write(i)
    input = input[:-1]
else:
    print("End of permutation cycle")

Какие выходы:

('two', 'three', 'one', 'four')
('two', 'four', 'one', 'three')
('three', 'two', 'one', 'four')
('four', 'two', 'one', 'three')
('two', 'one', 'three', 'four')
('two', 'one', 'four', 'three')
('three', 'one', 'four', 'two')
('four', 'one', 'three', 'two')
('one', 'two', 'three', 'four')
('one', 'two', 'four', 'three')
('three', 'four', 'one', 'two')
('four', 'three', 'one', 'two')
('two', 'three', 'four', 'one')
('two', 'four', 'three', 'one')
('three', 'two', 'four', 'one')
('three', 'four', 'two', 'one')
('four', 'two', 'three', 'one')
('four', 'three', 'two', 'one')
('three', 'one', 'two', 'four')
('four', 'one', 'two', 'three')
('one', 'four', 'two', 'three')
('one', 'three', 'two', 'four')
('one', 'three', 'four', 'two')
('one', 'four', 'three', 'two')
('two', 'three', 'one')
('three', 'two', 'one')
('three', 'one', 'two')
('one', 'two', 'three')
('one', 'three', 'two')
('two', 'one', 'three')
('two', 'one')
('one', 'two')
End of permutation cycle

Я понимаю, что я ошибаюсь с

input = input[:-1]

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

Использую ли я не ту часть itertools? Я должен использовать комбинации или что-то еще?

Я серьезно застрял, поэтому любая помощь очень ценится!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Я не могу понять, как вернуть только уникальные списки с разным количеством значений в каждом списке ... Должен ли я использовать комбинации или что-то еще?

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

Я понимаю, что ошибаюсь с input = input[:-1]

Верно; Не удаляйте предметы из набора кандидатов самостоятельно. Требуемая функциональность уже встроена.

>>> import itertools
>>> help(itertools.combinations)
Help on class combinations in module itertools:

class combinations(builtins.object)
 |  combinations(iterable, r) --> combinations object
 |
 |  Return successive r-length combinations of elements in the iterable.
 |
 |  combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)

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

(Кстати, для такого рода вещи есть замечательный пример в разделе «рецепты» документации : помеченный powerset. Набор мощности набора - это в основном то, что вы вычисляете, за исключением того, что в него включены все результаты с одним элементом и пустой результат.)

0 голосов
/ 08 марта 2020

Предполагая, что ('one', 'two', 'three') было случайно пропущено из вашего списка разыскиваемых, это должно сработать:

from itertools import combinations

l = ['one', 'two', 'three', 'four']

for size in range(2,len(l)+1):
    for i in combinations(l,size):
        print(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...