2013-02-18 14 views
14

In Python, wie bekomme ich alle Kombinationen von n Binärwerte 0 und 1?Wie bekomme ich die ganze Kombination von n Binärwert?

Zum Beispiel, wenn n = 3 möchte ich

[ [0,0,0], [0,0,1], [0,1,0], [0,1,1], ... [1,1,1] ] #total 2^3 combinations 

Wie kann ich dies tun haben?

+0

@eumiro bekommen können, Ich denke meine Frage entspricht auch dieser, http://stackoverflow.com/questions/3252528/converting-a-number-to-binary-with-a-fix Ed-Länge, aber diese Antwort gibt eine Zeichenfolge anstelle einer Liste. – LWZ

Antwort

35

Verwenden itertools.product

import itertools 
lst = list(itertools.product([0, 1], repeat=3)) 

Diese eine Liste von Tupeln ergeben wird (siehe here)

Sie können ganz einfach diese eine repeat Variable verwenden ändern:

n = 3 
lst = list(itertools.product([0, 1], repeat=n)) 

Wenn Sie eine Notwendigkeit Liste der Listen, dann können Sie die map Funktion verwenden (danke @Aesthete).

lst = map(list, itertools.product([0, 1], repeat=n)) 

Oder in Python 3:

lst = list(map(list, itertools.product([0, 1], repeat=n))) 
# OR 
lst = [list(i) for i in itertools.product([0, 1], repeat=n)] 

Beachten Sie, dass mit map oder eine Liste Verständnis bedeutet, dass Sie das Produkt nicht in eine Liste konvertieren müssen, wie es durch das itertools.product Objekt iteriert wird und Erstelle eine Liste.

+3

+1 - 'map (Liste, Produkt ([0, 1], repeat = 3))' wird das gleiche Format zurückgeben, falls das OP interessiert ist. – Aesthete

+0

Das ist großartig, Tupel ist auch in Ordnung. – LWZ

+0

@ Volatilität, nur aus Neugier, woher weißt du das? Ich hatte keine Ahnung, wie ich diese Funktion in der Python-Dokumentation finde. – LWZ

1

Nach erhalten Sie alle solche Kombinationen

bin = [0,1] 
[ (x,y,z) for x in bin for y in bin for z in bin ] 
+1

Er gibt 'n = 3' nur als Beispiel, also möchte er diese parametrisieren lassen. – eumiro

+0

Das funktioniert, aber n kann nicht groß sein ... – LWZ

3

Ohne jegliche in-Build-Funktionen oder intelligente Techniken wir wie dieses

def per(n): 
    for i in range(1<<n): 
     s=bin(i)[2:] 
     s='0'*(n-len(s))+s 
     print map(int,list(s)) 
per(3) 

Ausgang

[0, 0, 0] 
[0, 0, 1] 
[0, 1, 0] 
[0, 1, 1] 
[1, 0, 0] 
[1, 0, 1] 
[1, 1, 0] 
[1, 1, 1] 
Verwandte Themen