在Python中生成n长度位列表

我想要一个函数,它将为我提供指定长度的所有可能的字符串,这些字符串仅由零和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上输入内存错误.

解决方法:

请改用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)]

对于较大的ns,返回生成器可能更合适.

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)
上一篇:python – 2个列表中所有可能的字典组合排列


下一篇:python – 需要帮助更快地进行排列