问题what is the best way to generate a cartesian product of some lists, not knowing in advance how many lists there are?
如果你喜欢的话,你可以在这里停止阅读。在
背景
我没有钱上学,所以我试着自学编程
在高速公路收费站上夜班时使用互联网。我有
决定尝试解决一些“编程挑战”问题作为练习。在
程序设计作业
下面是我要解决的问题,TopCoder的属性:http://community.topcoder.com/stat?c=problem_statement&pm=3496
我不会复制和粘贴完整的说明,以尊重他们的版权声明
但我想我可以总结一下,前提是我不逐字逐句地使用它
(尽管如此)。在
总结
如果历史股票价格的“加权和”是获得的附录的总和
将这些价格的一个子集乘以相等数量的“权重”
如果后者相加到1.0,并从给定集合中选择
对于有效值[-1.0,-0.9,…,0.9,1.0],对所有
作为函数参数提供的历史数据,检查5价格
一次,预测下一个价格并返回“权重”的排列
平均预测误差最小的因子。至少会有
每次运行6个股票价格,因此至少有一个预测是最终的
结果应在1E-9范围内准确。在
测试数据
格式:一行输入数据,格式为list
一行表示预期结果
一个空行作为间隔
下载位置:
我的解决方案
^{pr2}$
我的问题
我不要求对我的解决方案进行代码复查,因为这将是一个错误的StackExchange论坛。在这种情况下,我会把我的解决方案发布到“代码评审”中。在
相反,我的问题是小,精确和明确,符合这个网站的格式(希望如此)。在
在我的代码中,我使用itertools生成列表的笛卡尔积。本质上,我不是自己解决问题的症结,而是将解决方案委托给一个为我解决问题的库。如果我想从这些练习中学习,我认为这是一种错误的方法。我应该自己做最难的部分,否则为什么还要做这个练习?所以我想问你:what is the best way to generate a cartesian product of some lists, not knowing in advance how many lists there are?
我只想知道这些,如果你愿意,你可以批评我的代码。这是受欢迎的,即使它通过了所有的测试(总有更好的方法来做事情,尤其是如果你是一个像我这样的初学者的话),但是为了让这个问题“恰到好处”,我只关注代码的一个方面,一个我所遇到的具体问题和我不满意的东西。让我告诉你更多,我也将分享经典的“你已经尝试了什么”。。。在
很明显,如果我知道列表的数量,我就可以键入一些嵌套的for循环,就像这个练习的顶级解算器在比赛中所做的那样。我尝试编写一个函数来处理未知的列表数量,但我不确定采用哪种方法。第一种方法是编写递归函数。从列表1中,获取元素1并将其与列表2的元素1组合,然后将列表3的元素1等组合在一起。我将把每个“层”中的元素推到堆栈上,并在达到所需深度时弹出它们。我可以想象我不会害怕“堆栈溢出”,因为可以达到的深度是合理的。然后,我努力选择一种数据结构,以尽可能高效的(内存/空间)方式来实现这一点,而不向递归调用传递太多参数。数据结构是否应该存在于调用之外?在电话里传来传去?我可以实现任何级别的并行吗?怎样?有这么多的问题和这么少的答案,我意识到我需要知道更多的知识来解决这个问题我们应该朝着正确的方向轻推。你可以提供一个代码片段,我会研究它。或者向我解释一下什么是处理这类问题的正确“计算机科学”方法。我肯定有些事情我没有考虑。在
最后,我在上面的解决方案中考虑的是,谢天谢地,过滤器过滤了生成器,这样完整的笛卡尔积永远不会保存在内存中(就像我在代码中任何时候做一个列表(所有的权值排列)一样),所以我只在内存中为那些可以实际用作加权和。如果将类似的警告应用于任何允许我使用itertools生成笛卡尔积的系统都会很好。在