【发布时间】:2015-12-26 16:15:20
【问题描述】:
以下示例给出了相同的结果:
一个。
product = []
for a in "abcd":
for b in "xy":
product.append((a,b))
B.
from itertools import product
list(product("abcd","xy"))
当我不知道参数 n 的数量时,如何计算示例 A 中的笛卡尔积?
原因我问这个:
考虑这段代码:
allocations = list(product(*strategies.values()))
for alloc in allocations:
PWC[alloc] = [a for (a,b) in zip(help,alloc) if coalitions[a] >= sum(b)]
strategies 字典的值是元组列表,help 是辅助变量(每个alloc 长度相同的列表),coalitions 是另一个字典,它分配给帮助中的元组一些数值。
由于策略值已排序,我知道 if 语句在某个 alloc 之后将不再为真。由于分配是一个相当大的列表,如果我可以使用示例算法 A,我会避免大量的比较和大量的总和。
【问题讨论】:
-
究竟是什么反对为此使用
itertools.product? -
因为在这种情况下,b 的值(我们只考虑每个 alloc 的最后一个元素)将是元组,例如:(0.0.1),(0.0.2),(0.0.3)等等(很长的解释为什么)。相反,coalitions[a] 是一个常数。如果coalitions[a] = 3,我知道在b = (0.0.3)之后,a的所有下一个值一定不能包含在PWC[alloc]中。
-
我不太明白。您是否想在某个时候取消从笛卡尔积中迭代更多元素?在这种情况下,使用 A 中的列表推导式如何帮助您做到这一点?
-
对不起,忘记列表理解并考虑嵌套循环(我将立即编辑)。我需要笛卡尔积的所有元素。每个元素都是 PWC 字典中的一个键。每个键重定向到一个列表,并且此类列表的每个第 n 个元素的存在取决于该键的第 n 个元素的总和(它是一个元组的元组)。虽然这样的总和小于某个常数,但该元素必须进入列表中。因为我知道每次迭代的总和都会不断增加,一旦达到极限,我就不需要再检查总和了。
标签: python python-2.7 cartesian-product