通过itertools.combinations对象的生成器进行迭代将永远花费

问题描述

编辑::
在与juanpa&Fusion在此处进行的所有这些讨论和评论中,以及Kevin对python chat的讨论之后,我得出的结论是,iteratinggenerator所花费的时间与{{ 1}}通过其他任何对象,因为生成器本身会即时生成那些iterating。此外,融合方法combinationslen(arr)(也许1000)中都非常有效-但由于超时,它会终止,当然是在线判断-请注意,它不是因为尝试获取5k,但我还必须获取min_variance_sub中所有可能的对中的sum of absolute differences。我将接受融合的方法作为该问题的答案,因为它回答了该问题。 但是,我还将针对该问题陈述创建一个新问题(更像是min_variance_sub,我还将在其中回答QnA的问题-我从其他候选人提交的答案中得到了答案,{{1 }}(由问题解决者自己编写)和由问题解决者自己编写的代码-尽管我不理解他们使用的方法)。创建该链接时,我将链接到另一个问题:)
HERE

原始问题从下面开始

我在数组上使用future visitors,所以首先我尝试了类似的方法

editorial

其中cmb = itertools.combinations,arr是列表,k是整数。 这对于len(arr)aList = [list(x) for x in list(cmb(arr,k))] 。

在kevin关于Python聊天的建议下,我使用了itertools.combinations,它在生成这样的组合时工作得非常快

MemoryError

但是遍历此生成器对象太慢了。 我尝试过类似

generator

甚至这段代码似乎永远都需要。

Kevin还提出了一个关于aGen = (list(x) for x in cmb(arr,k)) 的答案,这很不错,但就我而言,我实际上是想测试所有可能的组合并选择带有for p in aGen: continue 的组合。

那么检查数组(列表)的所有可能组合是否具有kth combination的内存有效方式是什么(确切地说,我只需要考虑具有精确到k个元素)

谢谢您的帮助。

解决方法

您可以先使用n个元素对列表进行排序,

然后使用沿着排序列表的k长的移动窗口。

并找到n-k+1个可能组合的最小方差。

最小值应为所有组合的最小值。

 
def myvar(arr):
    l = len(arr)
    m = sum(arr)/l
    return sum((i-m)**2 for i in arr)/l


input_list = [.......]

sorted_list = sorted(input_list)

variance = None
min_variance_sub = None
for i in range(len(sorted_list) - k + 1):
    sub = sorted_list[i:i+k]
    var = myvar(sub)
    if variance is None or var<variance:
        variance = var
        min_variance_sub=sub
print(min_variance_sub)