如何解决通过itertools.combinations对象的生成器进行迭代将永远花费
编辑::
在与juanpa&Fusion在此处进行的所有这些讨论和评论中,以及Kevin对python chat的讨论之后,我得出的结论是,iterating
到generator
所花费的时间与{{ 1}}通过其他任何对象,因为生成器本身会即时生成那些iterating
。此外,融合方法在combinations
到len(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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。