2015-02-24 178 views
0
elementList = [ 0.05, 0.07, 0.08, 0.15, 0.25, 0.32, 0.4 ] 

pathLength = elementList[-1]  

itElement = iter(elementList) 
for a in itElement: 
    b = next(itElement) 
    c = next(itElement) 
    elementSize1 = b - a 
    percentOfPathElement.append(elementSize1/pathLength) 
    elementSize2 = c - b 
    percentOfPathElement.append(elementSize2/pathLength) 

我有一個曲線上的點列表,我需要計算它們之間的距離,並將Value/pathLength附加到列表中。遍歷整個列表並返回一個項目

所以我需要做的:

0.07-0.05 
0.08-0.07 
0.15-0.08 
etc... 

如果我運行上面的代碼,當到達循環結束,它會跳過一個計算,因爲「一個」轉到下一個值,當我真的需要返回一個值。

+0

貌似少數實例之一,其中一個雙鏈接上市將是完美的(我知道的) 。 – Mike 2015-02-24 21:09:36

回答

1

這被稱爲鄰近差異。使你的方法工作:

itElement = iter(elementList) 
a = next(itElement) 
for b in itElement: 
    elementSize1 = b - a 
    percentOfPathElement.append(elementSize1/pathLength) 
    a = b 

印刷ab在每次迭代得出:

0.05 0.07 
0.07 0.08 
0.08 0.15 
0.15 0.25 
0.25 0.32 
0.32 0.4 

而且percentOfPathElement爲:

[0.05000000000000001, 0.024999999999999988, 0.17499999999999996, 0.25, 0.17500000000000002, 0.20000000000000004] 

如果需要錯過了最後一個元素,變化itElement = iter(elementList)itElement = iter(elementList[:-1])

您也可以使用列表理解,如(修改自Kasra AD):

percentOfPathElement = [(b - a)/pathLength for a, b in zip(elementList, elementList[1:])] 

或(從Blckknght修改):

import operator 
percentOfPathElement = [diff/pathLength for diff in map(operator.sub, elementList[1:], elementList)] 

這些作品以同樣的方式作爲第一版本,但可能會更難理解。

+0

感謝您的詳細解釋! – 2015-02-25 14:00:50

1

您可以只使用zip功能,讓渴望對再計算出分:

>>> elementList = [ 0.05, 0.07, 0.08, 0.15, 0.25, 0.32, 0.4 ] 
>>> [j-i for i,j in zip(elementList,elementList[1:])] 
[0.020000000000000004, 0.009999999999999995, 0.06999999999999999, 0.1, 0.07, 0.08000000000000002] 
+1

爲什麼使用'operator.sub'的時候只能寫'j - i'? – Blckknght 2015-02-24 21:22:22

+0

@Blckknght是的,它只是一個習慣:) – Kasramvd 2015-02-24 21:23:56

+0

其實,使用像這樣的運算符函數可能是有意義的,如果你使用map而不是列表理解:map(operator.sub,elementList,elementList [1:]) '這幾乎與你的代碼一樣,但在Python 3中它將是一個生成器而不是一個列表。 – Blckknght 2015-02-24 21:26:22