2011-02-08 13 views
19

Me gustaría encontrar una manera limpia e inteligente (en python) para encontrar todas las permutaciones de cadenas de 1s y 0s x caracteres de largo. Lo ideal sería que esto sería rápido y no requiere hacer demasiadas iteraciones ...todas las permutaciones de una secuencia binaria x bits de largo

Así, para x = 1 Quiero: [ '0', '1'] = 2 x [ '00', '01 ',' 10' , '11']

etc ..

ahora mismo tengo unas pocas cosas, que es lento y parece poco elegante:

self.nbits = n 
    items = [] 
    for x in xrange(n+1): 
     ones = x 
     zeros = n-x 
     item = [] 
     for i in xrange(ones): 
      item.append(1) 
     for i in xrange(zeros): 
      item.append(0) 
     items.append(item) 
    perms = set() 
    for item in items: 
     for perm in itertools.permutations(item): 
      perms.add(perm) 
    perms = list(perms) 
    perms.sort() 
    self.to_bits = {} 
    self.to_code = {} 
    for x in enumerate(perms): 
     self.to_bits[x[0]] = ''.join([str(y) for y in x[1]]) 
     self.to_code[''.join([str(y) for y in x[1]])] = x[0] 
+0

es esta tarea? – AShelly

+3

Tenga en cuenta que en realidad no está describiendo permutaciones. –

+2

Estoy sintiendo que viene una corriente de respuesta de código de golf. :-) – payne

Respuesta

46

itertools.product está hecho para esto:

>>> import itertools 
>>> ["".join(seq) for seq in itertools.product("01", repeat=2)] 
['00', '01', '10', '11'] 
>>> ["".join(seq) for seq in itertools.product("01", repeat=3)] 
['000', '001', '010', '011', '100', '101', '110', '111'] 
+0

Gracias, esto es lo que ¡estaba buscando! – ComputationalSocialScience

4

Usted puede utilizar itertools.product() para hacer esto.

import itertools 
def binseq(k): 
    return [''.join(x) for x in itertools.product('01', repeat=k)] 
+0

Tenga en cuenta que puede hacer esto aún más rápido usando 'map' como la construcción de bucle:' map (''. Join, itertools.product ('01 ', repeat = k)) ' – ncoghlan

5

No hay necesidad de ser demasiado inteligente para algo tan simple:

def perms(n): 
    if not n: 
     return 

    for i in xrange(2**n): 
     s = bin(i)[2:] 
     s = "0" * (n-len(s)) + s 
     yield s 

print list(perms(5)) 
5

Python 2.6+:

['{0:0{width}b}'.format(v, width=x) for v in xrange(2**x)] 
+0

Inteligente, pero (al menos en mi máquina, con un tamaño modesto 2 ** (16 ... 20)) ~ 3 más lento que la respuesta de Josh. – eat

1

Felicitaciones a todo el sol inteligente antes que yo. Aquí es un nivel bajo, conseguir-usted-manos sucias manera de hacer esto:

def dec2bin(n): 
    if not n: 
     return '' 
    else: 
     return dec2bin(n/2) + str(n%2) 

def pad(p, s): 
    return "0"*(p-len(s))+s 

def combos(n): 
    for i in range(2**n): 
     print pad(n, dec2bin(i)) 

Que debe hacer el truco

Cuestiones relacionadas