Python – 列表元素之间的差异
给出一个数列表如何找出每个( i )和( i+1 )个元素之间的差异? 应该更好地使用lambda还是列表理解? 
 例子:给定一个列表t=[1,3,6,...]它是find一个列表v=[2,3,...]因为3-1=2 6-3=3等 
 >>> t [1, 3, 6] >>> [ji for i, j in zip(t[:-1], t[1:])] # or use itertools.izip in py2k [2, 3] 
其他答案是正确的,但如果你正在做数值工作,你可能要考虑numpy。 使用numpy,答案是:
 v = numpy.diff(t) 
 如果你不想使用numpy或zip ,你可以使用简单的(我认为最简单的)解决scheme: 
 >>> t = [1, 3, 6] >>> v = [t[i+1]-t[i] for i in range(len(t)-1)] >>> v [2, 3] 
 您可以使用itertools.tee和zip来有效地生成结果: 
 from itertools import tee # python2 only: #from itertools import izip as zip def differences(seq): iterable, copied = tee(seq) next(copied) for x, y in zip(iterable, copied): yield y - x 
 或者使用itertools.islice代替: 
 from itertools import islice def differences(seq): nexts = islice(seq, 1, len(seq)) for x, y in zip(seq, nexts): yield y - x 
 你也可以避免使用itertools模块: 
 def differences(seq): iterable = iter(seq) prev = next(iterable) for element in iterable: yield element - prev prev = element 
如果您不需要存储所有结果,所有这些解决scheme都可以在恒定的空间内工作。 第一个和最后一个解决scheme也适用于无限可迭代,而第二个解决scheme需要一个有限序列作为input。
以下是解决scheme的一些微观基准:
 In [12]: L = range(10**6) In [13]: from collections import deque In [15]: %timeit deque(differences_tee(L), maxlen=0) 10 loops, best of 3: 122 ms per loop In [16]: %timeit deque(differences_islice(L), maxlen=0) 10 loops, best of 3: 127 ms per loop In [17]: %timeit deque(differences_no_it(L), maxlen=0) 10 loops, best of 3: 89.9 ms per loop 
还有其他build议的解决scheme:
 In [18]: %timeit [x[1] - x[0] for x in zip(L[1:], L)] 10 loops, best of 3: 163 ms per loop In [19]: %timeit [L[i+1]-L[i] for i in range(len(L)-1)] 1 loops, best of 3: 395 ms per loop In [20]: import numpy as np In [21]: %timeit np.diff(L) 1 loops, best of 3: 479 ms per loop In [35]: %%timeit ...: res = [] ...: for i in range(len(L) - 1): ...: res.append(L[i+1] - L[i]) ...: 1 loops, best of 3: 234 ms per loop 
注意:
-   zip(L[1:], L)等同于zip(L[1:], L[:-1])因为zip已经在最短的input上终止,但是它避免了L的整个副本。
- 通过索引访问单个元素非常缓慢,因为每个索引访问都是在python中的方法调用
- 
numpy.diff很慢,因为它必须首先将list转换为一个ndarray。 很明显,如果你从一个ndarray开始 ,它会快得多:In [22]: arr = np.array(L) In [23]: %timeit np.diff(arr) 100 loops, best of 3: 3.02 ms per loop
好。 我想我find了适当的解决办法:
 v = [x[1]-x[0] for x in zip(t[1:],t[:-1])] 
function性方法:
 >>> import operator >>> a = [1,3,5,7,11,13,17,21] >>> map(operator.sub, a[1:], a[:-1]) [2, 2, 2, 4, 2, 4, 4] 
使用发生器:
 >>> import operator, itertools >>> g1,g2 = itertools.tee((x*x for x in xrange(5)),2) >>> list(itertools.imap(operator.sub, itertools.islice(g1,1,None), g2)) [1, 3, 5, 7] 
使用索引:
 >>> [a[i+1]-a[i] for i in xrange(len(a)-1)] [2, 2, 2, 4, 2, 4, 4] 
我的方式
 >>>v = [1,2,3,4,5] >>>[v[i] - v[i-1] for i, value in enumerate(v[1:], 1)] [1, 1, 1, 1]