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

时间:2016-11-14 10:17:48

标签: 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

它让我回复:

>>> result
[18, 54]

你知道python函数吗?

4 个答案:

答案 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)中的步骤相似时,此方法才有效,在这里不是这种情况。