2013-03-23 788 views
4

我想要一個函數,它會給我所有可能的由只有零和1組成的長度的字符串。例如:在Python中生成一個長度爲n的位列表

spam(4) 

應該得到我:

['0110', '0111', '0001', '0011', '0010', '0101', '0100', '1110', '1100', '1101', '1010', '1011', '1001', '1000'] 

我試圖用itertools.permutations作業。所以,這就是我所做的。

def getPerms(n): 
    perms = getCandidates(n) 
    res = [] 
    for i in perms: 
     res.extend(permutations(i)) 
    res = clean(res) 
    return res 

def clean(ar): 
    res = [] 
    for i in ar: 
     temp = "" 
     for j in i: 
      temp += j 
     res.append(temp) 
    return list(set(res)) 

def getCandidates(n): 
    res = [] 
    for i in range(1, n): 
     res.append("1"*i + "0"*(n-i)) 
    return res 

但是,這是非常低效的,並提供了10作爲輸入的內存錯誤。

+4

要清楚 - 你希望它包含至少一個和至少一個零?因爲'0000'和'1111'應該在你的設置中。 – nneonneo 2013-03-23 03:11:48

+0

是的,我需要這些可能性。 – Gerard 2013-03-23 14:27:08

回答

7

你只是想生成位串,顯然。這是我知道的最快方法:

for i in xrange(1, 2**n-1): 
    yield '{:0{n}b}'.format(i, n=n) 

這生成一個長度爲每比特串正好n包含至少一個1和0一個

例子:

>>> def gen(n): 
...  for i in xrange(1, 2**n-1): 
...   yield '{:0{n}b}'.format(i, n=n) 
... 
>>> list(gen(4)) 
['0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110'] 
+0

或者只是'['{:0 {} b}'。格式(i,n)爲我在範圍內(1 << n)]' – georg 2013-03-23 09:41:30

+0

謝謝!這很好用! – Gerard 2013-03-23 14:23:17

9

使用itertools.product代替。

>>> import itertools 
>>> [''.join(i) for i in itertools.product('01', repeat=4)] 
['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111'] 

使用功能(假設itertools已經導入):

def bitGen(n): 
    return [''.join(i) for i in itertools.product('01', repeat=n)] 

對於較大n要返回的發電機可能是更合適的。

def bitGen(n): 
    return (''.join(i) for i in itertools.product('01', repeat=n)) 

# Alternatively: 

def bitGen(n): 
    for i in itertools.product('01', repeat=n): 
     yield ''.join(i) 
+0

或'對於我在itertools.product('01',repeat = n):在最後一個產生''.join(i)'。 – nneonneo 2013-03-23 03:20:22

+0

@nneonneo謝謝,我已經把它放在 – Volatility 2013-03-23 03:24:29

+0

我沒有考慮使用itertools.product()。謝謝! – Gerard 2013-03-23 14:24:08

0

除了上述優秀的答案,如果你想繼續走下去,你的啓動路徑,這裏是一個更好的實現使用yield

from itertools import permutations 

def spam(n): 
    for perm in getPerms(n): 
     print perm, 
    print 

def getPerms(n): 
    for i in getCandidates(n): 
     for perm in set(permutations(i)): 
      yield ''.join(perm) 

def getCandidates(n): 
    for i in range(1, n): 
     res = "1" * i + "0" * (n - i) 
     yield res 

spam(4) 
0

或者你可以使用遞歸..這有的能夠產生任意的n位k基數

def bitStr(numDig, base): 
if numDig == 0: return [] 
if numDig == 1: return [str(i) for i in range(0,base)] 
return [ digit + bits for digit in bitStr(1, base)for bits in bitStr(numDig - 1, base)] 

打印的額外優點(bitStr(4,2))

相關問題