簡體   English   中英

從Python列表中刪除常見因素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM