給出一個數字列表如何找到每個元素(i
)和(i+1
)之間的差異 - 它的元素?應該更好地使用lambda還是列表理解?Python - 列表元素之間的差異
例: 給出一個列表t=[1,3,6,...]
是找一個列表v=[2,3,...]
因爲3-1=2
,6-3=3
等
給出一個數字列表如何找到每個元素(i
)和(i+1
)之間的差異 - 它的元素?應該更好地使用lambda還是列表理解?Python - 列表元素之間的差異
例: 給出一個列表t=[1,3,6,...]
是找一個列表v=[2,3,...]
因爲3-1=2
,6-3=3
等
>>> t
[1, 3, 6]
>>> [j-i for i, j in zip(t[:-1], t[1:])] # or use itertools.izip in py2k
[2, 3]
確定。我認爲我找到了合適的解決方案:
v = [x[1]-x[0] for x in zip(t[1:],t[:-1])]
雅良好,但我認爲它應該是 v = [x [0] -x [1] for zip in(t [1:],t [: - 1])] 已排序的列表! – 2016-01-31 10:38:08
其他答案是正確的,但如果你正在做數值工作,你可能要考慮numpy。使用numpy的,答案是:
v = numpy.diff(t)
如果你不想使用numpy
也不zip
,您可以使用簡單(簡單的在我看來)的解決方案:
>>> 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
所有在不斷的空間解決方案,這些工作,如果你不需要存儲所有結果。 第一個也是最後一個解決方案也適用於無限可迭代,而第二個解決方案需要有限序列作爲輸入。
下面是解決方案的一些微基準測試:
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
而另外提出的解決方案:
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
已經以最短的輸入終止,但它避免了L
的整個副本。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
我的方式
>>>v = [1,2,3,4,5]
>>>[v[i] - v[i-1] for i, value in enumerate(v[1:], 1)]
[1, 1, 1, 1]
使用'枚舉'是浪費的,因爲你沒有使用'value'。請參閱https://stackoverflow.com/a/16714453/832230 – 2016-11-25 08:01:16
的功能的方法:
>>> 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]
如果你需要絕對的差異,'[ABS(JI)爲I,J拉鍊(T,T [1:])]' – Anil 2015-07-14 00:09:48