Python 快速查找值小于或等于的第一个条目

Python 快速查找值小于或等于的第一个条目,python,Python,比方说,在Python中,我有一个文件列表,文件大小各不相同,用dict表示(我不关心结构,您可以提出另一个): 示例文件列表: {'file_0': 2, 'file_1': 21, 'file_2': 20, 'file_3': 16, 'file_4': 12, 'file_5': 67, 'file_6': 95, 'file_7': 16, 'file_8': 2, 'file_9': 5} 现在我想快速找到低于指定阈值的最高值。例如: get_value_belo

比方说,在Python中,我有一个文件列表,文件大小各不相同,用dict表示(我不关心结构,您可以提出另一个):

示例
文件列表

{'file_0': 2,
 'file_1': 21,
 'file_2': 20,
 'file_3': 16,
 'file_4': 12,
 'file_5': 67,
 'file_6': 95,
 'file_7': 16,
 'file_8': 2,
 'file_9': 5}
现在我想快速找到低于指定阈值的最高值。例如:

get_value_below(fileslist, threshold=25) # result should be 'file_1' with value 21
函数get_value_below()将在紧循环中调用,因此它应该尽可能快,并且可以指定任何阈值(因此排序没有直接帮助)


有没有比浏览整个列表(线性时间)更快的方法呢?

这取决于您在
文件列表中搜索阈值的频率。如果您要做的不仅仅是
Θ(logn)
查询,那么最好先排序,然后对每个查询执行二进制搜索。否则,如果您只想执行一个查询,那么最好是线性搜索,因为您想要的元素实际上可以在任何地方,并且您肯定需要访问列表中的每个元素


如果您计划首先使用排序,然后使用二进制搜索,然后将其用于输入
x
,则它将返回列表中包含最大元素的位置,该元素低于或等于
x
,我建议使用DataFrame,这将快速解决您的搜索问题

考虑以下示例:

from pandas import DataFrame as df

th = 25

d = df(['file_0', 'file_1', 'file_2', 
         'file_3', 'file_4', 'file_5', 
         'file_6', 'file_7', 'file_8', 
         'file_9'],
         [2,21,20,16,12,67,95,16,2,5])

x = d.loc[d.index < th]
x = x.loc[x.index == max(x.index)]
print x

不要通过排序数组线性搜索,使用二进制搜索(duh)。一方面,这是CS101儿童用品。另一方面,我不知道对分库,代码中充斥着
np.nonzero(SORTEDONY比linear更快的方式是,如果在我的实现中对列表进行排序,则列表会被排序,但问题仍然是,我需要在一个紧密的循环中获得一个小于或等于阈值的随机值。对列表进行排序没有直接帮助(使用二进制/二分法搜索时除外,如JuniorCompressor的答案所示,在对分模块中)。它使搜索日志(n)与O(n)相对这是一个重大的改进。这是正确的,所以我接受你的答案。从技术上讲,这是一个二进制/二分法搜索,我不知道我以前怎么没有想到它,但事实上我很高兴,因为我发现了二分法模块,感谢你的答案。此外,文档给出了一个函数find_le()的示例这正是我所需要的。此外,这也会有很大的帮助。非常感谢,事实上我想到了我广泛使用的熊猫,但在我的情况下,我需要依靠的不是外部图书馆,而是本地图书馆(很抱歉,我在问题中没有提到它).然而,你的链接非常有趣,我不知道Numpy的searchsorted,也不知道namedtuples是巨大的内存节省器。因此,我会给你一笔奖金!
from pandas import DataFrame as df

th = 25

d = df(['file_0', 'file_1', 'file_2', 
         'file_3', 'file_4', 'file_5', 
         'file_6', 'file_7', 'file_8', 
         'file_9'],
         [2,21,20,16,12,67,95,16,2,5])

x = d.loc[d.index < th]
x = x.loc[x.index == max(x.index)]
print x
         0
21  file_1