[英]Remove common factors from list of lists in 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]。 最有效的方法是什么?
聽起來您想要所有不具有共同因素的組合(顯然不是1)。 例如: [2, 3, 4]
應該在您的列表中,因為您不能考慮除一個以外的所有其他人共享的單個數字。 另一方面,可以將[2,4,0]
視為2 * [1, 2, 0]
[2,4,0]
2 * [1, 2, 0]
。 您可以使用math.gcd
查找GCD-GCD是關聯的,因此您可以將其嵌套(或將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]
視為特例。
使用itertools.product()
創建列表並刪除不需要的項目本身效率低下:最好在列表生成階段跳過這些項目。
但是,如果仍然要刪除項目,則可以使用類似於Eratosthenes篩網的方法 :
拿一些列表,例如(0,0,1)
,將其倍增2-得到(0,0,2)
-刪除它。 然后乘以3-得到(0,0,3)
-也將其刪除。 然后對乘數4和5進行相同的操作。如果找到任何這樣的列表,也請刪除原始列表。
取得列表的已修改列表的下一項,然后重復該過程。
在最簡單的方法中,您可以一直嘗試使用2到5的乘法器。 如果要對其進行優化,可以先找到最大值,然后最多檢查5//max_value
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.