python 同时查找多个列表的相邻元素之间的差异

8xiog9wr  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(148)

有很多方法可以获取相邻元素的差异并创建一个新的差异列表。例如given here。但是,我有太多的列表,我需要为每个列表创建差异列表。我不想一遍又一遍地写同样的东西。最短(和/或)有效的方法是什么?
例如,假设我有list 1、list 2、...、listn,并且我想创建d_list1、d_list2、...、d_listn。其中d_list是由list 1 [i+1]-list 1 [i]创建的列表。这同样适用于d_list2,其中元素是list 2 [i+1]-list 2 [i]。

e0uiprwp

e0uiprwp1#

把你所有的列表放在一个列表列表中,然后用一个偏移量把它们压缩在一起,这样你就给予了一对列表,然后压缩它们并减去:

l1 = [1, 2, 3, 4]
l2 = [10, 20, 30, 40]
l3 = [11, 12, 13, 14]
l4 = [21, 22, 23, 24]

lists = [l1, l2, l3, l4]

[[a - b for a, b in zip(l2, l1)] for l1, l2 in zip(lists, lists[1:])]

这将为您提供一个差异列表:

[[9, 18, 27, 36], [1, -8, -17, -26], [10, 10, 10, 10]]

如果你真的有很多列表,使用Numpy可能是值得的,它有一个diff函数:

import numpy as np

a = np.array([
    [1, 2, 3, 4],
    [10, 20, 30, 40],
    [11, 12, 13, 14],
    [21, 22, 23, 24]
])

np.diff(a, axis=0)

给予:

array([[  9,  18,  27,  36],
       [  1,  -8, -17, -26],
       [ 10,  10,  10,  10]])

根据注解编辑

要在另一个轴上求diff,不需要外部zip,只需要内部zip:

l1 = [1, 2, 3, 4]
l2 = [10, 20, 30, 40]
l3 = [11, 12, 13, 14]
l4 = [21, 22, 23, 24]

lists = [l1, l2, l3, l4]

[[b - a for a, b in zip(l, l[1:])] for l in lists]

给予:

[[1, 1, 1], [10, 10, 10], [1, 1, 1], [1, 1, 1]]

在Numpy中,只需更改轴:

np.diff(a, axis=1)

它会产生与Numpy数组相同的结果:

array([[ 1,  1,  1],
       [10, 10, 10],
       [ 1,  1,  1],
       [ 1,  1,  1]])

相关问题