如何引用循环中的下一个元素?

时间:2014-04-08 02:26:31

标签: python arrays list for-loop iterator

我一直在四处寻找,但无法找到我想要的东西。我确定我以前见过这件事,但我似乎无法找到它。这是一个例子:

在这种情况下,我想区分数组中每个元素的区别,

#Generate sample list
B = [a**2 for a in range(10)]
#Take difference of each element
C = [(b+1)-b for b in B]

(b + 1)是表示数组中的下一个元素,我不知道该怎么做,显然不起作用,给出了结果:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

我想要的结果是:

 [1, 3, 5, 7, 9, 11, 13, 15, 17]

我知道这个结果比原始数组短,但原因是要替换丑陋的表达式,例如:

 C = [B[i+1]-B[i] for i in range(len(B)-1)]

在这种情况下,它实际上并不是那么糟糕,但有些情况下我需要使用长表达式迭代多个变量,并且每次都必须编写索引会很烦人。现在我希望有一种简单的pythonic方式来做到这一点,我不知道......

编辑:关于必须使用多个变量执行此操作的一个示例是:

 X = [a for a in range(10)]
 Y = [a**2 for a in range(10)]
 Z = [a**3 for a in range(10)]

 for x,y,z in zip(X,Y,Z):
     x + (x+1) + (y-(y+1))/(z-(z+1))

其中(x + 1),(y + 1),(z + 1)表示下一个元素而不是:

 for i in range(len(X)):
     x[i] + x[i+1] + (y[i]-y[i+1])/(z[i]-z[i+1])

我正在使用python 2.7.5 btw

4 个答案:

答案 0 :(得分:3)

re:你的编辑

zip仍然是正确的解决方案。你只需要在列表上压缩两个迭代器,第二个就应该提前一个。

from itertools import izip,tee

cur,nxt = tee(izip(X,Y,Z))

next(nxt,None) #advance nxt iterator

for (x1,y1,z1),(x2,y2,z2) in izip(cur,nxt):
    print x1 + x2 + (y1-y2)/(z1-z2)

如果您不喜欢内联next来电,可以使用islice,例如@FelixKling提及:izip(cur,islice(nxt, 1, None))

答案 1 :(得分:2)

备选您可以使用zip来创建当前值的元组,下一个值:

C = [b - a for a, b in zip(B, B[1:])]

我相信zip会在Python 3中返回一个生成器。在Python 2中,您可能想要使用izipB[1:],您可以使用isliceislice(B, 1, None)

答案 2 :(得分:0)

也许你想要enumerate。如下:

C = [B[b+1]-item for b,item in enumerate(B[:-1])]

或简单地说:

C = [B[b+1]-B[b] for b in range(len(B[:-1]))]

他们都工作。

实施例

>>> B = [a**2 for a in range(10)]
>>> C = [B[b+1]-item for b,item in enumerate(B[:-1])]

>>> print C
[1, 3, 5, 7, 9, 11, 13, 15, 17]

答案 3 :(得分:0)

这是一种非常奇怪的方式,但它确实有效!

b = [a**2 for a in range(10)]
print b
print reduce(lambda x, y:len(x) and x[:-1]+[y-x[-1], y] or [y], b, [])

我在CodeBunk上创建了一个bunk,所以你也可以运行它

http://codebunk.com/b/-JJzLIA-KZgASR_3a-I8