2011-02-08 45 views
19

Tôi muốn tìm một cách sạch sẽ và thông minh (trong python) để tìm tất cả các hoán vị của chuỗi 1s và 0s x ký tự. Lý tưởng này sẽ được nhanh chóng và không đòi hỏi quá nhiều làm lặp đi lặp lại ...tất cả hoán vị của một chuỗi nhị phân x bit dài

Vì vậy, cho x = 1 Tôi muốn: [ '0', '1'] x = 2 [ '00', '01 ', '10' , '11']

vv ..

Ngay bây giờ tôi có điều này, đó là chậm và dường như không thanh nha:

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

là bài tập về nhà này? – AShelly

+3

Lưu ý rằng bạn không thực sự mô tả hoán vị. –

+2

Tôi đang cảm thấy một luồng câu trả lời trên nền tảng mã. :-) – payne

Trả lời

46

itertools.product được làm cho điều này:

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

Cảm ơn, đây là những gì tôi đang được tìm kiếm! – ComputationalSocialScience

4

Bạn có thể sử dụng itertools.product() để làm điều này.

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

Lưu ý rằng bạn có thể thực hiện điều này nhanh hơn bằng cách sử dụng 'map' làm cấu trúc vòng lặp:' map (''. Join, itertools.product ('01 ', repeat = k)) ' – ncoghlan

5

Không cần phải quá thông minh cho một cái gì đó đơn giản này:

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

Thông minh, nhưng (ít nhất là trong máy của tôi, với kích thước khiêm tốn 2 ** (16 ... 20)) ~ 3 chậm hơn câu trả lời của Josh. – eat

1

Kudos cho tất cả các sol thông minh trước mặt tôi. Đây là một mức độ thấp, get-bạn-tay-bẩn cách để làm điều này:

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

Điều đó sẽ làm các trick

Các vấn đề liên quan