2010-10-31 70 views
1

可能重复:
Python: Looping through all but the last item of a list阅读其他项目,同时通过它迭代

是否有通过列表迭代时,你还需要下一个项目一个更好的方法(或任何其他任意项目)在列表中?我用这个,但也许有人可以做的更好......

values = [1, 3, 6, 7 ,9] 
diffs = [] 
for i in range(len(values)): 
    try: diffs.append(values[i+1] - values[i]) 
    except: pass 

print diffs 

给出:

[2, 3, 1, 2] 
+0

相关:http://stackoverflow.com/questions/323750/。 – 2010-10-31 09:47:00

回答

1

你可以在你的情况下使用

for pos, item in enumerate(values): 
    try: 
     diffs.append(values[pos+1] - item) 
    except IndexError: 
     pass 

虽然(因为你只是希望为下一个值),你也可以简单地使用

for item,nextitem in zip(values, values[1:]): 
    diffs.append(nextitem-item) 

其也可以表示为一个列表理解:

diffs = [nextitem-item for item,nextitem in zip(values, values[1:])] 
+0

删除了我先前的评论。如果列表长度大于100个元素,那么这确实比'if'更便宜。所以这不是'非常大的',因为我声称这是提高效率所必需的。对困惑感到抱歉。带有'itertools.islice'的 – aaronasterling 2010-10-31 09:58:34

4
>>> values = range(10) 
>>> values 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> zip(values[0:],values[1:]) 
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9)] 
+1

当然是足够大的列表。 – aaronasterling 2010-10-31 09:48:14

+0

虽然这在这种情况下可行,但获取物品索引和物品的方法是使用“枚举”生成器 - 请检查@Tim Pietzcker的回答 – jsbueno 2010-10-31 12:41:17

+1

@jsbueno - 真实但无关紧要,重点是配对物品在列表中不要获得可迭代的索引。 @aaron:的确如此! – katrielalex 2010-10-31 14:31:51

1
for i, j in zip(values, values[1:]): 
    j - i 
+1

对于大列表和Python 2.x,itertools.izip可能更有效。 – 2010-10-31 09:46:47

1
diff = [values[i+1] - values[i] for i in range(len(values)-1)] 
2

什么有关使用的辅助pairwise recipe from itertools document

from itertools import tee, izip 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 
def main(): 
    values = [1, 3, 6, 7 ,9] 
    diffs = [post - prior for prior, post in pairwise(values)] 
    print diffs 


if __name__ == "__main__": 
    main() 

输出
[2,3,1 ,2]

0
[y - x for x,y in zip(L,L[1:])] 
+0

你还没有见过以前的答案,对吗? – SilentGhost 2010-10-31 16:56:07