2013-06-18 19 views
10

So che posso usare itertools.permutation per ottenere tutte le permutazioni della dimensione r. Tuttavia, per itertools.permutation([1,2,3,4],3) restituirà (1,2,3) e (1,3,2).Python - ottieni tutte le permutazioni di una lista senza ripetizioni

  1. voglio filtrare quelle ripetizioni (cioè ottenere combinazioni)

  2. C'è un modo semplice per ottenere tutte le permutazioni (di tutte le lunghezze)?

  3. Come è possibile convertire il risultato di itertools.permutation() in un elenco normale?

+1

Stai cercando 'combinazioni'? –

risposta

19

Usa itertools.combinations e un ciclo semplice per ottenere combinazioni di tutte le dimensioni.

combinations restituire un iteratore, quindi è necessario passarlo a list() per vedere il suo contenuto (o consumarlo).

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

Cosa? Una domanda di un anno con 5 upvotes (otterrà sesto da me) ha menzionato 'itertools' come * itertool * e nessuno è riuscito a correggere l'errore di battitura ??? –

4

È necessario itertools.combinations(). E per ottenere una lista regolare, basta usare la funzione di fabbrica 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

Sembra che in realtà si sta cercando 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)] 

Questo esempio mostra anche come convertire il risultato a una lista regolare, basta passare al built-in funzione di list().

Per ottenere le combinazioni per ogni lunghezza si può semplicemente utilizzare un ciclo simile al seguente:

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

O per ottenere il risultato come un elenco nidificato è possibile utilizzare una lista di comprensione:

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

Per un elenco semplice invece di nidificare:

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