我有一个用
制成的列表的列表itertools.product(range(5), repeat=3)
给出
[[0 0 0]
[0 0 1]
[0 0 2]
[0 0 3]
[0 0 4]
[0 1 0]
[0 1 1]
... etc]
我想删除所有具有共同整数因子的列表,但0和1的琐碎情况除外,因为那样的话,它将匹配所有列表。例如,[0 0 2]是[0 0 1]乘以2,所以我想删除[0 0 2]。另一个示例是[3 3 3],它是[1 1 1]乘以3,所以我想删除[3 3 3]。最有效的方法是什么?
答案 0 :(得分:3)
听起来您想要所有不具有共同因素的组合(显然不是1)。例如:[2, 3, 4]
应该在您的列表中,因为您不能考虑除一个以外的所有其他人共享的单个数字。另一方面,[2,4,0]
可以被认为是2 * [1, 2, 0]
。您可以使用math.gcd
查找GCD,因为GCD是关联的,因此您可以将其嵌套(或对general solution使用reduce()
)。
from itertools import product
from math import gcd
from functools import reduce
test = lambda p: reduce(gcd, p) == 1
[p for p in product(range(5), repeat=3) if test(p)]
结果
[(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(0, 1, 2),
(0, 1, 3),
(0, 1, 4),
(0, 2, 1),
(0, 2, 3),
...
(4, 2, 3),
(4, 3, 0),
(4, 3, 1),
(4, 3, 2),
(4, 3, 3),
(4, 3, 4),
(4, 4, 1),
(4, 4, 3)]
由于gcd的工作方式,您需要将[0,0,0]
视为特例。
答案 1 :(得分:0)
使用itertools.product()
创建列表并删除不需要的项目本身效率低下:最好在列表生成阶段跳过这些项目。
但是,如果您仍要删除项目,则可以使用类似于Sieve of Eratosthenes的方法:
获取一些列表,例如(0,0,1)
,将其加2倍-您将获得(0,0,2)
-删除它。然后乘以3-得到(0,0,3)
-也将其删除。然后对乘数4和5进行相同的操作。如果找到任何这样的列表,也请删除原始列表。
采用修改后的列表列表的下一项,然后重复该过程。
在最简单的方法中,您可以一直尝试使用2到5的乘法器。如果要对其进行优化,可以先找到最大值,然后最多检查5//max_value
。