我有一个这样的列表:
l = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]]
,我想找到2个连续列表之间元素相减的最大值。 示例:
在[9,9,9]
和[8,7,6]
之间->最多[1,2,3]
-> 3
在[4,5,9]
和[9,9,9]
之间-> [5,4,0]
的最大值-> 5
在[1,5,1]
和[4,5,9]
之间-> [3,0,8]
的最大值-> 8
然后,我想列出一个带有[3,5,8]
的列表
由于我的代码必须与numpy
的1.6.1版本兼容,所以我这样做是:
new_l = []
for index, i in enumerate(l):
if index < len(l)-1:
t = []
for jndex, j in enumerate(i):
t.append(l[index +1][jndex] - l[index][jndex])
new_l.append(max([abs(number) for number in t]))
new_l = new_l[:-1]
有更好的方法吗?预先感谢
答案 0 :(得分:2)
使用常规Python,您可以两次对zip
使用列表推导:
L = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]]
res = [max(abs(i-j) for i, j in zip(*values)) for values in zip(L, L[1:])]
[3, 5, 8]
答案 1 :(得分:2)
以下嵌套的理解将起作用:
l = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]]
[max(map(abs, (x-y for x, y in zip(a, b)))) for a, b in zip(l, l[1:])]
# [3, 5, 8]
zip(l, l[1:])
生成成对的相邻列表,然后再次压缩它们以获取成对的差异。
答案 2 :(得分:1)
根据@Divakar's comment,这是标准的NumPy解决方案:
res = np.abs(np.diff(L, axis=0)).max(1)
对于大型阵列,您可能会通过numba
看到明显的性能提升。两种版本都比非向量化的Python列表理解更为有效。
from numba import njit
L = np.array([[8,7,6], [9,9,9], [4,5,9], [1,5,1]] * 10**6)
@njit
def differ(A):
res = np.zeros(A.shape[0]-1)
for i in range(A.shape[0]-1):
for j in range(A.shape[1]):
res[i] = max(res[i], abs(A[i+1, j] - A[i, j]))
return res
assert np.array_equal(np.abs(np.diff(L, axis=0)).max(1), differ(L))
%timeit np.abs(np.diff(L, axis=0)).max(1) # 161 ms per loop
%timeit differ(L) # 53.7 ms per loop
%timeit [max(abs(i-j) for i, j in zip(*v)) for v in zip(L, L[1:])] # 22.5 s per loop