查找列表中列表之间的最大减法

时间:2018-10-12 09:41:20

标签: python list numpy

我有一个这样的列表:

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]

有更好的方法吗?预先感谢

3 个答案:

答案 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