3

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

4 に答える 4

8

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

s が大きい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)
于 2013-03-23T03:14:16.837 に答える
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']
于 2013-03-23T03:13:52.810 に答える
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)
于 2013-03-23T03:38:53.923 に答える