在python中查找列表中的周围元素

Aga*_*'lo 0 python-2.7

我想找到列表中一个元素周围的两个元素。我建议这个代码(它有效),但我很确定有一种方法可以以更简单的方式做到这一点。

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
Run Code Online (Sandbox Code Playgroud)

它返回给我:

>>> result
[18, 54]
Run Code Online (Sandbox Code Playgroud)

你知道python的函数吗?

Rus*_*m K 5

我会使用二分搜索。您需要找到大于的第一个元素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)
Run Code Online (Sandbox Code Playgroud)

更短的方法:

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]))
Run Code Online (Sandbox Code Playgroud)

重要提示:数组应该按排序顺序