使所有元组不超过0

时间:2013-09-27 09:30:09

标签: python performance

例如,我可以使用A= list(itertools.product([0, 1], repeat=n))使所有n元组仅包含1和0。如何在没有创建A然后删除大量元组的情况下有效地创建不超过0的所有元组?

2 个答案:

答案 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)