从列表中获取“边缘数字”

7

我有一份数据列表,如下所示:

[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,这比任何其他相邻数字对之间的差异都要大。


你想知道哪里的差异超过了1? - Mad Physicist
我对什么是边缘编号感到困惑。 - mckuok
基本上,是的。 - Yuchen Huang
2
为什么[747, 752]不是“边缘数字”? - wim
@wim,谢谢,这是我忽略的一个条件,我想要的两个数字是彼此之间最远的。 - Yuchen Huang
4个回答

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])

太好了!这正是我想要的! - Yuchen Huang

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
假设您的列表始终单调递增,并且您只想知道这些值:
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]))

抱歉,我忽略了一个条件,[747,752]。对于边缘编号,它们应该是最远的两个数字。 - Yuchen Huang
已更新,考虑了最大条件。 - Mad Physicist

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接