Найти элемент ниже или равным значению в списке

У меня есть отсортированный CSV-файл с несколькими столбцами, и я хочу вернуть значение или индекс элемента в столбце 1. Этот CSV-файл имеет от 300 000 до 400 000 значений, поэтому я стараюсь избегать любых min функция, так как это, вероятно, займет много времени, и мне нужно значение в секунду.

Итак, что я делаю - это добавляю записи column1 в список с помощью:

with open('example.csv', 'r') as f:
     reader = csv.reader(f, delimiter=';')
     for row in reader:
         array.append(int(row[0])) 

А теперь самое сложное, поскольку я не смог найти подходящую функцию и / или пример, который искал более низкое или равное значение. Я попытался отредактировать этот пример, который я нашел на stackru.com

def find_closest(t):
 idx = bisect.bisect_left(array, t) # Find insertion point

# Check which timestamp with idx or idx - 1 is closer
 if idx > 0 and abs(array[idx] - value) > abs(array[idx - 1] - value):
     idx -= 1

 return array[idx]

В этом примере выдается ближайшее значение: ниже, равно или больше. Но мне не удалось изменить это так, как я хочу.

В качестве примера с числами я ищу:

array=[123,123,123,124,125,125,125,128,128,128,128]
value1=124
value2=127

Таким образом, при поиске value1 он должен вернуть return1=124 или индекс. Если значение не включено, как значение2, оно должно вернуть самое высокое значение, которое меньше искомого значения. return2=125даже если более высокое значение 128 ближе.

Я попытался использовать модуль bisect, но потерпел неудачу с треском. Любые советы приветствуются.

Привет

1 ответ

Решение

Это предполагает, что у вас есть отсортированный список:

def foo(the_list, value):
    index = bisect.bisect_left(the_list, value)
    return the_list[index] if the_list[index] == value or index == 0 else the_list[index-1]
Другие вопросы по тегам