这里对排序列表也提出了类似的问题,但所使用的解决方案对分不适用于保留排序列表。
假设我有一个列表,按相反的顺序排序,键入中间元素,
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]
建议如何以最快的方式完成?
请尝试以下操作:
threshold = [0.97, 0.90, 0.83, 0.6]
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 = []
ti = 0
for i, item in enumerate(my_list):
if item[1] >= threshold[ti]:
continue
while ti < len(threshold) and item[1] < threshold[ti]:
index_list.append(i)
ti += 1
使用numpy,我认为它看起来比纯python实现更干净,并且几乎肯定会更快:
import numpy as np
arr = np.array([[3,0.99,1], [2,0.98,54], [10,.85,4], [1,0.7,10], [12,0.69,31], [12,0.65,43], [10,0.50, 24]])
thresholds = [0.97, 0.90, 0.83, 0.60]
idx = [np.min(np.where(arr[:,1] < i)) for i in thresholds if np.where(arr[:,1] < i)[0].size > 0]
print idx
[2, 2, 3, 6]
根据@gnibbler的这个好答案,您可以自己重写bisect
代码以满足您的需要
我稍微修改了@gnibbler中的代码,以便可以在您的案例中使用
一个优化是,由于您的阈值也被排序,我们不需要每次都搜索整个列表,而是从最后一个结果索引开始
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))
按降序排序的LinkedHashSet的输出。 对不起,如果这是混淆,我不知道如何去排序像这样。
我需要找到高于指定阈值的的第一个和最后一个元素。我找到了以下解决方案,这是有效的,但它看起来有点令人费解。有没有更简单/更蟒蛇的方式?
这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?
问题内容: 我有直接列表List1。 如何更改订单。而且我不知道如何从扩展类重写方法,请编写示例或说清楚。 问题答案: 用这个:
给定一个向量和一个有序向量,我想要一个向量,其中 ] 等于 中最小元素的索引,以便
我有一个2D麻木阵列: 如何获取大于的元素的索引? 现在,我正在做以获取每个最大值的索引,结果是:。我如何实现上述操作?