2011-02-08 11 views
19

Chciałbym znaleźć czysty i sprytny sposób (w pytonie), aby znaleźć wszystkie permutacje ciągów o długości 1s i 0s x chars. Idealnie byłoby to szybka i nie wymaga zbyt wielu iteracji robi ...wszystkie permutacje binarnej sekwencji x bitów długich

Tak, dla x = 1 Chcę: [ '0', '1'] x = 2 [ '00', '01 ”'10' , '11']

etc ..

teraz mam to, co jest powolne i wydaje nieeleganckie:

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

jest to praca domowa? – AShelly

+3

Należy zauważyć, że w rzeczywistości nie opisano permutacji. –

+2

Czuję nadchodzący strumień odpowiedzi na kod w golfa. :-) – payne

Odpowiedz

46

itertools.product jest za to:

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

Dzięki, właśnie to szukałem! – ComputationalSocialScience

4

można użyć itertools.product() jak to zrobić.

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

Zauważ, że możesz zrobić to jeszcze szybciej używając 'map' jako konstrukcji pętli:' map (''. Join, itertools.product ('01 ', repeat = k)) ' – ncoghlan

5

Nie trzeba być zbyt mądry czegoś ta prosta:

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

Sprytny, ale (przynajmniej w moim komputerze, ze skromnym rozmiarem 2 ** (16 ... 20)) ~ 3 wolniej niż odpowiedź Josha. – eat

1

Uznanie dla wszystkich sprytnych solów utrudnienia przede mną. Tutaj znajduje się na niskim poziomie, dostać-you-hands-dirty sposobem, aby to zrobić:

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

To powinno załatwić sprawę

Powiązane problemy