2013-06-18 10 views
10

Wiem, że mogę użyć itertools.permutation, aby uzyskać całą permutację wielkości r. Ale dla itertools.permutation([1,2,3,4],3) zwróci on (1,2,3), a także (1,3,2).Python - pobierz całą permutację listy bez powtórzeń

  1. chcę odfiltrować te powtórzeń (czyli uzyskać kombinacje)

  2. Czy istnieje prosty sposób, aby uzyskać wszystkie permutacje (wszystkich długościach)?

  3. Jak mogę przekonwertować wynik itertools.permutation() na zwykłą listę?

+1

Szukasz "kombinacji"? –

Odpowiedz

19

Zastosowanie itertools.combinations i prosta pętla uzyskać kombinacje wszystkich rozmiarów.

combinations zwraca iterator, więc musisz go przekazać do list(), aby zobaczyć jego zawartość (lub go pobrać).

>>> 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)] 
+0

Co? Roczne pytanie z 5 upvotes (otrzyma 6 miejsce ode mnie) wspomniało 'itertools' jako * itertool * i nikt nie zdołał naprawić literówki ??? –

4

Potrzebujesz itertools.combinations(). Aby uzyskać zwykłą listę, wystarczy użyć funkcji fabrycznej list().

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

Brzmi jak jesteś rzeczywiście szuka 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)] 

Ten przykład pokazuje również, w jaki sposób przekonwertować wynik do regularnej liście, po prostu przekazać je do wbudowanej list() funkcji.

Aby uzyskać kombinacji dla każdej długości można po prostu użyć pętli tak:

>>> 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)] 

lub uzyskać wynik jako zagnieżdżonej listy można użyć wyrażeń listowych:

>>> [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)]] 

Aby uzyskać listę płaską zamiast zagnieżdżoną:

>>> [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)]