我想找到列表中元素周围的两个元素。我提出这个代码(它可以工作),但我很确定有一种方法可以更简单的方式做到这一点。
a = [4,5,6,8,9,15,16,18,54,60]
b = 24
i = 0
while i<len(a):
if b > a[i-1] and b < a[i+1]:
result = [a[i-1],a[i]]
i = i+1
else:
i = i+1
它让我回复:
>>> result
[18, 54]
你知道python函数吗?
答案 0 :(得分:4)
我会使用二进制搜索。您需要找到大于b
的第一个元素或小于b
的最后一个元素。比如说,我们在某个索引j
处找到了第二个元素的索引,该索引在二进制搜索中更大。那么我们的答案是b [j - 1],b [j]等等其他案例。这适用于O(logN)时间。
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
if a[j] > b:
return (None if j == 0 else a[j-1]), a[j]
else:
return a[j], (None if j >= n - 1 else a[j + 1])
if __name__ == '__main__':
a = [4,5,6,8,9,15,16,18,54,60]
b = 24
print find(a, 24)
print find(a, 3)
print find(a, 4)
print find(a, 7)
print find(a, 60)
更短的方法:
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
return ((None if j == 0 else a[j-1]), a[j]) if a[j] > b else (a[j], (None if j >= n - 1 else a[j + 1]))
重要:数组应按排序顺序
答案 1 :(得分:1)
假设只有一个实例b
位于两个连续数字之间,您可以使用zip
并检查配对元素:
a = [4, 5, 6, 8, 9, 15, 16, 18, 54, 60]
b = 24
for i, j in zip(a,a[1:]):
if i < b < j:
result = [i,j]
break
答案 2 :(得分:0)
lst = [1,4,3,2,5]
def min_max(p):
lst = []
lst.append(min(p))
lst.append(max(p))
return lst
print min_max(lst)
答案 3 :(得分:0)
我将使用这种单线(Python 3.7):
import numpy as np
a = [4,5,6,8,9,15,16,18,54,60]
b = 24
surrounding_values = np.sort([b + i for i in sorted(np.subtract(a,b),key=lambda x: abs(x))[:2]])
这基本上取了数组(b)的值和值(a)的排序差的前两个值。
编辑:仅当数组(a)中的步骤相似时,此方法才有效,在这里不是这种情况。