Python - получить все комбинации списка

Я знаю, что могу использовать itertools.permutation, чтобы получить всю перестановку размера r. Но для itertools.permutation([1,2,3,4],3) он вернет (1,2,3), а также (1,3,2).

  • Я хочу отфильтровать эти повторения (т.е. получить комбинации)

  • Есть ли простой способ получить все перестановки (всех длин)?

  • Как преобразовать результат itertools.permutation() в обычный список?

Ответ 1

Используйте itertools.combinations и простой цикл, чтобы получить комбинации любого размера.

combinations возвращают итератор, поэтому вы должны передать его в list() чтобы увидеть его содержимое (или использовать его).

>>> from itertools import combinations
>>> lis = [1, 2, 3, 4]
for i in xrange(1, len(lis) + 1):  #  xrange will return the values 1,2,3,4 in this loop
    print list(combinations(lis, i))
...     
[(1,), (2,), (3,), (4,)]
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
[(1,2,3,4)]

Ответ 2

Похоже, вы действительно ищете itertools.combinations():

>>> from itertools import combinations
>>> list(combinations([1, 2, 3, 4], 3))
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]

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

Чтобы получить комбинации для каждой длины, вы можете просто использовать цикл, как показано ниже:

>>> data = [1, 2, 3, 4]
>>> for i in range(1, len(data)+1):
...     print list(combinations(data, i))
... 
[(1,), (2,), (3,), (4,)]
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
[(1, 2, 3, 4)]

Или для получения результата в виде вложенного списка вы можете использовать понимание списка:

>>> [list(combinations(data, i)) for i in range(1, len(data)+1)]
[[(1,), (2,), (3,), (4,)], [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)], [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)], [(1, 2, 3, 4)]]

Для плоского списка вместо вложенного:

>>> [c for i in range(1, len(data)+1) for c in combinations(data, i)]
[(1,), (2,), (3,), (4,), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4), (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4), (1, 2, 3, 4)]

Ответ 3

Вам нужно itertools.combinations(). Чтобы получить обычный список, просто используйте функцию list() factory.

>>> from itertools import combinations
>>> list(combinations([1, 2, 3, 4], 3))
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]