2016-04-13 6 views
1

複数の列を持つソートされたcsvファイルがあり、カラム1の項目の値またはインデックスを返したいとします。このCSVファイルには300.000〜400.000という値があります。私はどのくらいmin機能を避けようとしていますが、これは時間がかかりますので、1秒未満で値が必要です。リスト内の値以下のアイテムを検索

それでは、私がやっていることを経由してリストに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] 

上に見出されるこの例では、同等またはそれ以上、より低い最も近い値を配っている。この例を編集しようとしましたしかし、私はそれを私が望むように変更することはできませんでした。私が探して番号を持つ例として

です:VALUE1を探していたときに

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

は、だから、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