从列表中获取“边缘编号”

时间:2018-08-15 22:04:18

标签: python

我有如下数据列表:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 747, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799]

我正在尝试从此列表中找出两个具有最大距离的连续数字。

在这种情况下,答案将是[47, 747],因为它们在列表中紧挨着列出,并且747 - 47 = 700比任何其他连续数字对都有更大的差异

4 个答案:

答案 0 :(得分:7)

>>> n = max(range(1, len(L)), key=lambda i: L[i] - L[i-1])
>>> L[n-1:n+1]
[47, 747]

基于numpy的方法是:

>>> a = np.array(L)
>>> n = np.diff(a).argmax()
>>> a[n:n+2]
array([ 47, 747])

答案 1 :(得分:4)

这是使用maxzip的解决方案

>>> l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 747, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799]
>>> max(zip(l,l[1:]), key=lambda t: abs(t[0]-t[1]))
(47, 747)

答案 2 :(得分:2)

假设您的列表总是单调递增,而您只想知道这些值:

for i in range(1, len(my_list)):
    if my_list[i] - my_list[i - 1] != 1:
        print(my_list[i - 1], my_list[i])

您可以使用列表推导来加快处理速度并保留值的副本:

pairs = [(my_list[i - 1], my_list[i]) for i in range(1, len(my_list)) if my_list[i] - my_list[i - 1] != 1]

如果您希望该对具有最大差异,请对结果应用max

max(pairs, key=lambda x: x[1] - x[0])

Numpy通常是一种处理数值的更优雅的解决方案。 diff函数尤其可用于比较邻居:

my_array = np.array(my_list)
mask = np.diff(my_array)

大多数numpy函数都会在输入时将数字列表转换为数组,diff也不例外。此处计算的蒙版是一个布尔数组,它告诉您边缘的位置。如果您的数据为数组格式,则应用掩码更容易,因此我明确进行了转换:

left = my_array[:-1][mask]
right = my_array[1:][mask]

同样,如果您想要最大值,请使用np.argmax

index = np.argmax(right - left)
print((left[index], right[index]))

答案 3 :(得分:2)

您可以使用np.diff函数:

import numpy as np
ls = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 747, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799]

indx = np.argmax(np.diff(ls))
print([ls[indx],ls[indx+1]])

打印:

[47, 747]