长度为x位的二进制序列的所有排列

34 投票
5 回答
31272 浏览
提问于 2025-04-16 11:25

我想找到一种简单又聪明的方法(用Python)来生成长度为x的由1和0组成的字符串的所有排列。理想情况下,这个方法应该快速,并且不需要进行太多的循环...

比如,当x = 1时,我想要得到: ['0','1']
当x = 2时,我想要得到: ['00','01','10','11']

依此类推...

现在我有的这个方法比较慢,看起来也不太优雅:

    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]

5 个回答

7

你可以使用 itertools.product() 来实现这个功能。

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

对于这么简单的事情,没必要想得太复杂:

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

itertools.product 是为这个目的而设计的:

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

撰写回答