2013-03-23 4 views
4

0과 1로만 구성된 지정된 길이의 가능한 모든 문자열을 제공하는 함수가 필요합니다. 예를 들어 :파이썬에서 길이 비트리스트 생성

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

명확하게하려면 적어도 하나 이상 0을 포함하고 싶습니까? 왜냐하면'0000'과'1111'이 당신의 세트에 있어야하기 때문입니다. – nneonneo

+0

예, 그 가능성이 필요합니다. – Gerard

답변

7

분명히 비트 문자열을 생성하기 만하면됩니다.

>>> 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} '. 범위 (1 << n)의 i에 대한 형식 (i, n)' – georg

+0

감사합니다! 그건 완벽하게 작동합니다! – Gerard

9

사용 itertools.product 대신 :

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

이 정확히 n 적어도 하나의 1 일 0

예를 들어 길이의 모든 비트 열을 생성 : 여기에 내가 알고있는 가장 빠른 방법입니다. 함수 사용

>>> 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 가정은 이미 수입 된) : n 큰 들어

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

발전기를 반환하는 것이 더 적합 할 수 있습니다이야.

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

또는 itertools.product ('01 ', repeat = n)의 경우 : 마지막에'.join (i)'를 반환하십시오. – nneonneo

+0

@nneonneo 감사합니다. 나는 itertools.product()를 사용하는 것에 대해 생각하지 않았습니다. – Volatility

+0

에 넣었습니다. 감사! – Gerard

0

는 여기 yield를 사용하여 더 나은 구현 임의의 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))

0

아니면 재귀를 사용할 수가 ..이있다 : 당신은 당신이 시작 길을 계속하려면 위의 우수한 답변에 추가

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)