从Python列表中删除常见因素

时间:2019-07-07 18:55:43

标签: python

我有一个用

制成的列表的列表
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]。最有效的方法是什么?

2 个答案:

答案 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