2016-04-13 5 views
1

У меня есть отсортированный файл csv с несколькими столбцами, и я хочу вернуть значение или индекс элемента в столбце 1. Этот файл csv имеет от 300 до 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])) 

А теперь наступает сложная часть, так как я не мог найти подходящую функцию и/или пример, который был ища более низкое или равное значение. Я попытался редактирую этот пример я нашел на stackoverflow.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 

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

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

Привет

+0

если столбец 1 отсортирован, то бинарный поиск (бисекция) является вашим другом, так что, возможно, расширить «я с треском провалился». – Tommy

ответ

0

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

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

Спасибо большое! Я испортил возвращаемое значение. Теперь все работает. – Max

 Смежные вопросы

  • Нет связанных вопросов^_^