Поиск того, куда попадает заданное число в разделе

#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