我有如下数据列表:
[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
比任何其他连续数字对都有更大的差异
答案 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)
这是使用max
和zip
的解决方案
>>> 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]