例如,我可以使用A= list(itertools.product([0, 1], repeat=n))
使所有n元组仅包含1和0。如何在没有创建A
然后删除大量元组的情况下有效地创建不超过0的所有元组?
答案 0 :(得分:2)
在将它们保留在列表中之前,将它们即时删除。
A = [x for x in itertools.product([0, 1], repeat=n) if sum(x)*2<=n]
我怀疑生成它们是整个算法的“硬”部分。因此,不要担心产生不必要的一半元组的2倍开销,而不是1。
此外,请记住,列表将占用大量N的大量内存。也许你可以一直使用生成器。
对于记录:我的第一次尝试仅适用于python 2.x,因为3.x itertools.ifilter()只是成为filter()。
A = list(itertools.ifilter(
lambda x:sum(x)*2<=n,
itertools.product([0, 1], repeat=n)))
答案 1 :(得分:0)
def generate(Tuple, n):
if len(Tuple) == n:
print Tuple
else:
if Tuple.count(1) >= n / 2: # If number of 1 is greater then n/2
generate(Tuple + (0, ), n) # then we can't append 1 to the tuple
else:
generate(Tuple + (1, ), n)
generate(Tuple + (0, ), n)
if __name__ == '__main__':
n = 4
generate((), n)