2013-06-18 16 views
10

Ich weiß, dass ich itertools.permutation verwenden kann, um alle Permutation der Größe r zu bekommen. Aber für itertools.permutation([1,2,3,4],3) gibt es (1,2,3) sowie (1,3,2) zurück.Python - Holen Sie sich alle Permutation einer Liste ohne Wiederholungen

  1. Ich will diese Wiederholungen filtern (d Kombinationen erhalten)

  2. Gibt es eine einfache Möglichkeit, alle Permutationen zu erhalten (alle Längen)?

  3. Wie kann ich itertools.permutation() Ergebnis in eine normale Liste konvertieren?

+1

Suchen Sie nach 'Kombinationen'? –

Antwort

19

Verwenden itertools.combinations und eine einfache Schleife Kombinationen aller Größe zu erhalten.

combinations geben Sie einen Iterator zurück, so dass Sie ihn an list() übergeben müssen, um seinen Inhalt zu sehen (oder ihn zu konsumieren).

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

Was? Eine ein Jahr alte Frage mit 5 Upvotes (wird 6. durch mich) hat 'itertools' als * itertool * erwähnt und niemand hat es geschafft, den Tippfehler zu beheben ??? –

4

Sie benötigen itertools.combinations(). Und um eine normale Liste zu erhalten, verwenden Sie einfach list() Factory-Funktion.

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

Es klingt wie Sie suchen eigentlich für 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)] 

Dieses Beispiel zeigt auch, wie das Ergebnis einer regelmäßigen Liste zu konvertieren, geben sie einfach auf den eingebauten in list() Funktion.

die Kombinationen für jede Länge Um Ihnen nur eine Schleife wie folgt verwendet werden:

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

Oder bekommen Sie das Ergebnis als verschachtelte Liste eine Liste Verständnis verwenden können:

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

Für eine flache Liste statt verschachtelt:

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