2016-04-13 49 views
1

我有一個有多個列的排序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])) 

而現在到了棘手的部分,因爲我無法找到一個合適的功能和/或例子是誰尋找更低或相等的價值。 我試圖編輯這個例子中我發現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更接近。

我試過使用平分模塊,但是我失敗了。任何tipps感激。

問候

+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

相關問題