#python #data-partitioning
#python #разделение данных
Вопрос:
Предположим, у меня есть отсортированный массив целых чисел, скажем
partition = [0, 3, 7, 12, 18, 23, 27]
а затем присваивается значение
value = 9
Я хотел бы вернуть интервал, на котором находится мое значение. Например
bounds = function(partition, value)
print(bounds)
>>>[7,12]
Есть ли какая-нибудь функция, которая могла бы мне помочь, или я должен создать это с нуля?
Комментарии:
1. Двоичный поиск быстро вернет необходимые границы. Существуют различные функции биннинга, которые будут это делать, но я подозреваю, что дополнительная настройка для этого может быть сложнее для чтения другими, чем двоичный поиск.
2. Почему голоса против? Я понимаю, что это, вероятно, глупо для вас, Python там не работает, но я учусь, когда я иду на проект на работе. Это был конкретный синтаксический вопрос, с которым я не был знаком в Python.
Ответ №1:
Попробуйте numpy.searchsorted() .Из документального фильма:
Найдите индексы, в которые элементы должны быть вставлены для поддержания порядка.
import numpy as np
partition = np.array( [0, 3, 7, 12, 18, 23, 27] )
value = 9
idx = np.searchsorted(partition,value)
bound = (partition[idx-1],partition[idx])
print(bound)
>>>>(7,12)
Преимущество searchsorted
заключается в том, что он может дать вам индекс для нескольких значений одновременно.
Комментарии:
1. Ваша привязка к разделу неверна. Измените его на
bound = (partition[idx-1],partition[idx])
2. Спасибо! Я изучаю Python на лету на работе, так что это было большим подспорьем.
Ответ №2:
Модуль bisect хорош для эффективного выполнения этого. Он вернет индекс более высокой границы.
Вам нужно будет выполнить некоторую проверку ошибок, если значение может выходить за пределы границ:
from bisect import bisect
partition = [0, 3, 7, 12, 18, 23, 27]
value = 9
top = bisect(partition, value)
print(partition[top-1], partition[top])
# 7 12
Ответ №3:
def function(partition,value):
for i in range(len(partition)):
if partition[i]<value and partition[i 1]>value:
print [partition[i],partition[i 1]]
partition = [0, 3, 7, 12, 18, 23, 27,5,10]
value=9
function(partition,value)
Комментарии:
1. Это не оптимальное решение, поскольку в худшем случае вам нужно будет коснуться каждого элемента хотя бы один раз. Если вы собираетесь реализовать это самостоятельно, вам лучше выполнить двоичный поиск: en.wikipedia.org/wiki/Binary_search_algorithm