簡體   English   中英

具有比較條件的列表理解內的列表理解

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

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