如何用最符合Python风格的方式找到列表中第一个大于x的索引?
例如,对于以下列表:
list = [0.5, 0.3, 0.9, 0.8]
该函数
f(list, 0.7)
将返回
2.
next(x[0] for x in enumerate(L) if x[1] > 0.7)
next()
,加一;但为了可读性也许可以改成这样:next(i for i,v in enumerate(L) if v > 0.7)
。 - Will Hardyitertools.chain()
替代添加列表的方法。 - Ignacio Vazquez-Abramsnext((i for i, x in enumerate(L) if x > value), -1)
。 - jfs如果列表已排序,则对于大型列表,bisect.bisect_left(alist, value)
比 next(i for i, x in enumerate(alist) if x >= value)
更快。
bisect_left
是O(log n),而listcomp是O(n),也就是说,n越大,bisect_left()
的优势就越大。我尝试使用bisect_left()
在range(10**6)
中查找500_000
的索引-> 3.75微秒,而使用带有next()
的genexpr -> 51.0毫秒[比预期慢了10_000
倍]。 - jfs>>> alist= [0.5, 0.3, 0.9, 0.8]
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0]
2
IndexError: list index out of range
。使用 index = next[ n for n,i in enumerate(alist) if i>0.7 ]
错误会显示:NameError: name 'index' is not defined
。next
稍微快一些:60,000 个数字的时间差为 12.7 ns 对比 11.9 ns。 - Leofilter(lambda x: x>.7, seq)[0]
bisect_left()
(最快的)和enumerate()
慢。 - Sergey Nevmerzhitskyenumerate
在列表上进行简单搜索,以跟踪列表中的位置,并在找到第一个大于阈值的值时退出循环。如果没有满足条件的条目,则会引发错误。for index, elem in enumerate(elements):
if elem > reference:
return index
raise ValueError("Nothing Found")
1) NUMPY ARGWHERE, 通用列表
如果您愿意使用numpy(在此处导入为np
),则以下内容适用于通用列表(排序或未排序):
np.argwhere(np.array(searchlist)>x)[0]
或者如果您需要将答案作为整数索引:
np.argwhere(np.array(searchlist)>x)[0][0]
2) NUMPY SEARCHSORTED,排序的列表(在搜索列表中非常高效)
然而,如果您的搜索列表[l1,l2,...]已排序,则使用函数np.searchsorted更加简洁和美观:
np.searchsorted(searchlist,x)
另一个例子:
map(lambda x: x>.7, seq).index(True)
l = [0.5, 0.3, 0.9, 0.8]
def f(l, x):
for i in l:
if i >x: break
return l.index(i)
f(l,.7)
或者
l = [0.5, 0.3, 0.9, 0.8]
def f(l, x):
for i in l:
if i >x: return l.index(i)
f(l,.7)
>>> f=lambda seq, m: [ii for ii in xrange(0, len(seq)) if seq[ii] > m][0]
>>> f([.5, .3, .9, .8], 0.7)
2
当我的列表非常长时,我遇到了类似的问题。理解或基于筛选器的解决方案会遍历整个列表。相反,itertools.takewhile
在条件第一次为false的时候就会打断循环:
from itertools import takewhile
def f(l, b): return len([x for x in takewhile(lambda x: x[1] <= b, enumerate(l))])
l = [0.5, 0.3, 0.9, 0.8]
f(l, 0.7)
2
,是因为0.9 > 0.7
还是因为0.8 > 0.7
?换句话说,你是按顺序搜索还是按递增的值搜索? - Sergey Orshanskiy