讓我們使用一個簡單的例子:假設我有一個串列串列
ll = [[1, 2], [1, 3], [2, 3], [1, 2, 3], [2, 3, 4]]
我想找到所有最長的串列,這意味著最大化len函式的所有串列。我們當然可以
def func(x):
return len(x)
maxlen = func(max(ll, key=lambda x: func(x)))
res = [l for l in ll if func(l) == maxlen]
print(res)
輸出
[[1, 2, 3], [2, 3, 4]]
但是我想知道是否有更有效的方法來做到這一點,尤其是當功能非常昂貴或串列很長時。有什么建議?
uj5u.com熱心網友回復:
當功能非常昂貴時
請注意,您func(x)對每個元素進行了兩次計算,首先是
maxlen = func(max(ll, key=lambda x: func(x)))
然后在那里
res = [l for l in ll if func(l) == maxlen]
因此存盤已經計算的內容將是有益的。functools.lru_cache允許輕松更換
def func(x):
return len(x)
使用
import functools
@functools.lru_cache(maxsize=None)
def func(x):
return len(x)
但是,請注意,由于資料的存盤方式,引數必須是可散列的,因此在您的示例中,您首先需要將串列轉換為tuples ie
ll = [(1, 2), (1, 3), (2, 3), (1, 2, 3), (2, 3, 4)]
請參閱檔案中的說明以進行進一步討論
uj5u.com熱心網友回復:
不能dictionary像下面這樣使用,(這是O(n))
ll = [[1, 2], [1, 3], [2, 3], [1, 2, 3], [2, 3, 4]]
from collections import defaultdict
dct = defaultdict(list)
for l in ll:
dct[len(l)].append(l)
dct[max(dct)]
輸出:
[[1, 2, 3], [2, 3, 4]]
>>> dct
defaultdict(list, {2: [[1, 2], [1, 3], [2, 3]], 3: [[1, 2, 3], [2, 3, 4]]})
或使用setdefault和不defaultdict如下:
ll = [[1, 2], [1, 3], [2, 3], [1, 2, 3], [2, 3, 4]]
dct = {}
for l in ll:
dct.setdefault(len(l), []).append(l)
輸出:
>>> dct
{2: [[1, 2], [1, 3], [2, 3]], 3: [[1, 2, 3], [2, 3, 4]]}
uj5u.com熱心網友回復:
從計算機科學/演算法的角度來看,這是一個非常經典的“歸約”問題。
所以,偽代碼。老實說,這是非常簡單的。
metric():= a mapping from elements to non-negative numbers
winner = []
maxmetric = 0
for element in ll:
if metric(element) larger than maxmetric:
winner = [ element ]
maxmetric = metric(element)
else if metric(element) equal to maxmetric:
append element to winner
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329327.html
