2012-10-13 73 views
1

我正在做一些返回計算,我想盡可能優雅地做下面的事情,但是我對列表理解的知識還不夠好。 (列表x可以是任何長度,不只是4個元素,元素是浮點數)。Python列表元素間操作 - 這可以通過列表理解來完成嗎?

x = [a, b, c, d] 
y = [(a-b)/b, (b-c)/c, (c-d)/d] 

謝謝!

+0

你有測試用例嗎? –

+0

@RudolfMühlbauer我嘗試了一個for循環,並得到它的工作,但它感覺'錯誤' – tfb

+1

以您理解的方式編程永遠不會錯 - 很可能您的代碼將被具有Python媲美知識的人閱讀。雖然語言提供了很多快捷方式,但我通常更喜歡「更直觀」(直接)版本 - 以便於同事! –

回答

3

這似乎是合理的,不是嗎?

>>> x = [1.,2.,3.,4.] 
>>> [ ((e-f)/f) for e,f in zip (x[:-1], x[1:]) ] 
[-0.5, -0.3333333333333333, -0.25] 
+0

對我來說太快了。 :^) – DSM

+0

@DSM lol;即使是同樣的例子!你不必刪除它,但是 - 你有一些很好的解釋! –

3

列表理解並不總是最好的方法,而只是一個語法快捷方式,旨在使代碼更簡潔。 對於像你這樣複雜的操作,我會建議採用舊的方式。作爲一個經驗法則,我一直認爲,如果你很難寫出它,其他人肯定會很難閱讀它。

無論如何,這裏是這樣做的兩種可能的途徑:

的Python的方式使用列表理解:

y = [(x[i] - x[i + 1])/x[i + 1] for i in xrange(len(x - 1))] 

的老式方法:

y = [] 
for i in range(len(x - 1)): 
    a = x[i] 
    b = x[i + 1] 
    y.append((a - b)/b) 
+0

啊!打我16秒。 +1,仍然 – inspectorG4dget

1

您可以使用其他人建議的zip,或

[(x[i]-x[i+1])/x[i+1] for i in range(len(x)-1)] 
+1

它應該是xrange(len(x) - 1)=> 0 .. x-2我認爲 –

+0

@lcfseth:你是對的。答案已更新 – inspectorG4dget

0

試試這個:

y = [(x[i-1]-x[i])/x[i] for i in range(1,len(x))] 

希望這有助於!

相關問題