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

因此,在查找 value1 时,它应该返回return1=124or 索引。当值不包括在内时 value2 它应该返回低于搜索值的最大值。return2=125即使较高的值 128 更接近。

我尝试使用 bisect 模块,但我失败了。任何小费表示赞赏。

问候

4

1 回答 1

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]
于 2016-04-13T19:17:41.267 回答