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

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

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

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

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


person Bush    schedule 18.06.2013    source источник
comment
Вы ищете combinations?   -  person Sukrit Kalra    schedule 18.06.2013


Ответы (3)


Используйте 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)]
person Ashwini Chaudhary    schedule 18.06.2013

Похоже, вы на самом деле ищете 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)]
person Andrew Clark    schedule 18.06.2013

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

>>> from itertools import combinations
>>> list(combinations([1, 2, 3, 4], 3))
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
person Rohit Jain    schedule 18.06.2013