gpt4 book ai didi

Python:第一个元素的索引小于反向排序列表中的阈值

转载 作者:太空狗 更新时间:2023-10-30 03:05:39 26 4
gpt4 key购买 nike

已对排序列表提出类似问题 here ,但解决方案使用了 bisect,它不适用于保留排序列表。

假设我有一个列表,以相反的顺序排序,以中间元素为键,

my_list = [[3,0.99,1], [2,0.98,54], [10,.85,4], [1,0.7,10], [12,0.69,31], [12,0.65,43], [1.56,0] ....]

我想在中间元素上应用一系列阈值,它位于一个单独的排序列表中,比如说

threshold = [0.97, 0.90, 0.83, 0.6]

我试图找出第一个小于阈值的元素的索引。在上面的例子中它应该返回,

index_list = [2, 2, 3, 6]

关于如何以最快的方式完成它的建议?

最佳答案

根据这个伟大的answer来自@gnibbler ,您可以自己重写 bisect 代码以满足您的需要

我从@gnibbler修改代码稍微,以便它可以在您的情况下使用

一个优化是因为你的thresholds也是排序的,所以我们不需要每次都搜索整个列表,而是从最后一个结果索引开始

def reverse_binary_search(a, x, lo=0, hi=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)/2
if x > a[mid][4]:
hi = mid
else:
lo = mid+1
return lo

my_list = [[3,0.99,1], [2,0.98,54], [10,.85,4], [1,0.7,10], [12,0.69,31], [12,0.65,43], [1.56,0]]
threshold = [0.97, 0.90, 0.83, 0.6]

index_list = []
last_index = 0
for t in threshold:
last_index = reverse_binary_search(my_list, t, last_index) # next time start search from last_index
index_list.append(last_index)

谢谢@PhilCooper求宝贵建议。这是他提议的使用生成器的代码:

def reverse_binary_search(a, threshold):
lo = 0
for t in threshold:
if lo < 0:
raise ValueError('lo must be non-negative')
hi = len(a)
while lo < hi:
mid = (lo+hi)/2
if t > a[mid][6]:
hi = mid
else:
lo = mid+1
yield lo

my_list = [[3,0.99,1], [2,0.98,54], [10,.85,4], [1,0.7,10], [12,0.69,31], [12,0.65,43], [1.56,0]]
threshold = [0.97, 0.90, 0.83, 0.6]

index_list = list(reverse_binary_search(my_list, threshold))

关于Python:第一个元素的索引小于反向排序列表中的阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com