2015-02-24 61 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

相关问题