2017-10-13 49 views
1

如何寫一個列表理解來訪問列表中的每個元素,和兩個相鄰的兩邊如何構建列表理解,需要在每次迭代期間訪問列表中的多個元素?

我想訪問每個元素,並在兩邊相鄰,應用函數,並返回結果作爲列表的新值。

在for循環中,很容易:

lst=[1, 30, 40, 2, 7, 8, 9, 22, 7, 8, 44, 39, 2, 1, 0, 88, 17] 

for ii in list(range(3,len(lst)-3)): 
    vals=lst[ii-2:ii+3] 
    new_val=np.mean(vals) 
    lst[ii]=new_val 

如何將一個訪問列表中的理解這些元素 - 即沒有能夠通過元素位置來訪問?

+0

目的是加快循環!循環中的處理需要很長時間。 – EHB

+2

將循環更改爲列表理解對性能沒有多大幫助。 – kindall

+3

考慮到您使用的是NumPy,您不應該使用列表或列表解析。 (另外,'new_val'計算使用了舊值和新值的混合,看起來並不是這個意圖。) – user2357112

回答

0

只是爲了顯示一個有用的模式,列表比較可以使用滯後指數片ziplst

lst=[1, 30, 40, 2, 7, 8, 9, 22, 7, 8, 44, 39, 2, 1, 0, 88, 17] 

[sum(vals)/3. for vals in zip(lst, lst[1:], lst[2:])] 
Out[8]: 
[23.666666666666668, 
24.0, 
16.333333333333332, 
5.666666666666667, 
8.0, 
13.0, 
12.666666666666666, 
12.333333333333334, 
19.666666666666668, 
30.333333333333332, 
28.333333333333332, 
14.0, 
1.0, 
29.666666666666668, 
35.0] 

一個numpy的解決方案:

np.convolve(lst, [1/3., 1/3., 1/3.], 'valid') 
Out[11]: 
array([ 23.66666667, 24.  , 16.33333333, 5.66666667, 
     8.  , 13.  , 12.66666667, 12.33333333, 
     19.66666667, 30.33333333, 28.33333333, 14.  , 
     1.  , 29.66666667, 35.  ]) 
相關問題