2016-11-14 8 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) 
Смежные вопросы