2016-11-14 77 views
0

我想查找列表中元素周圍的兩個元素。我提出這個代碼(它的工作原理),但我很確定有一種方法可以以更簡單的方式來實現。在python中查找列表中的周邊元素

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] 

你知道蟒蛇功能?

+0

對不起,我不明白你的問題。如果你看一個數組,你會發現它是排序的,而18是第一個最小的,54是第一個最高的。 –

+0

嗯,我不認爲這就是我想要的... –

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

重要:數組應該是有序

+0

它可能會工作,但我正在尋找比我所做的更短的事情。不管怎麼說,還是要謝謝你! –

+0

我更新了你的請求。把它縮短。 –

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