[英]List comprehension inside a list comprehension with comparison condition
我有一個這樣的列表,
sl=[[1,2,100],[2,100,4],[100,4,5],[4,5,6],[5,6,200],[6,200,7],[200,7,8],[7,8,300],[8,300,9]]
現在我想找到那些元素大於平均值的元素並將其存儲到列表中。
所以,列表看起來像,
[[100],[100],[100],[],[200],[200],[200],[300]]
我可以使用 for 循環來完成,代碼如下,
indices=[]
for i in sl:
indices.append([j for j in i if (j>(np.mean(i))])
但是執行時間長執行。 我想使用 for 循環並使用某種列表理解來完成相同的任務。
有什么辦法可以做到最有效的執行時間?
您應該在每個循環中只計算一次平均值。 這應該會有所改善:
indices = []
for i in sl:
mean = np.mean(i)
indices.append([j for j in i if j > mean])
我不認為將整個事情轉換為嵌套列表理解會有幫助,因為我們想在最內層循環之外提取均值計算。
對於規則形狀的列表,即內部嵌套級別每個列表的元素數量相同,我們可以使用 NumPy 工具來卸載計算部分,就像這樣 -
a = np.array(sl)
m = a>a.mean(1,keepdims=True)
idx = np.r_[0,m.sum(1).cumsum()]
f = a[m].tolist()
out = [f[i:j] for (i,j)in zip(idx[:-1],idx[1:])]
這將有利於sl
中的大量條目,即大len(sl)
。
您可以將所有內容都放在一個列表理解中,避免循環,獲得一些性能:
means = map(np.mean, sl)
indices = [list(filter(lambda x: x > m, l)) for l, m in zip(sl, means)]
你也可以這樣做:
sl=[[1,2,100],[2,100,4],[100,4,5],[4,5,6],[5,6,200],[6,200,7],[200,7,8],[7,8,300],[8,300,9]]
sl = np.array(sl)
# List of elements satisfying the condition
elem_list = [sl[i][m].tolist() for i,m in enumerate((sl.T>sl.mean(axis=1)).T)]
# List of index for which the respective elements satisfy the condition
index_list = [np.where(m)[0].tolist() for m in (sl.T>sl.mean(axis=1)).T]
結果是:
elem_list
[[100], [100], [100], [6], [200], [200], [200], [300], [300]]
index_list
[[2], [1], [0], [2], [2], [1], [0], [2], [1]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.