在列表中找到大于x的第一个索引的最Python方式是什么?
例如,
list = [0.5, 0.3, 0.9, 0.8]
功能
f(list, 0.7)
会回来
2.
在列表中找到大于x的第一个索引的最Python方式是什么?
例如,
list = [0.5, 0.3, 0.9, 0.8]
功能
f(list, 0.7)
会回来
2.
2
是因为0.9 > 0.7
还是因为0.8 > 0.7
?换句话说,您是按顺序搜索还是按值递增的顺序搜索?
Answers:
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)
next()
在2.6+中。next()
在早期版本中调用Genex的方法。
itertools.chain()
而不是像这样添加列表。
如果list是排序的话,那么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()
侧面越多。我试图找到的索引500_000
中range(10**6)
使用bisect_left()
- > 3.75微秒,并使用genexpr用next()
- > 51.0毫秒[10_000
时间]较慢的预期。
filter(lambda x: x>.7, seq)[0]
bisect_left()
(最快)和慢enumerate()
。
>>> 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
速度稍快:时序差异为12.7 ns,而60 000个数字的时间差异为11.9 ns。
for index, elem in enumerate(elements):
if elem > reference:
return index
raise ValueError("Nothing Found")
当我的清单很长时,我遇到了类似的问题。理解或基于过滤器的解决方案将贯穿整个清单。一旦条件第一次变为假,itertools.takewhile将中断循环:
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)
我知道已经有了很多答案,但是有时我会觉得pythonic这个词被翻译成“单线”。
当我认为更好的定义更接近此答案时:
“利用Python语言的功能来生成清晰,简洁和可维护的代码。”
尽管上面的一些答案很简洁,但我认为它们并不清楚,而且新手程序员需要一段时间才能理解,因此对于具有许多技能水平的团队来说,它们很难维护。
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)
我认为以上内容对于新手来说很容易理解,并且仍然足够简洁,可以被任何资深python程序员接受。
我认为编写愚蠢的代码是积极的。
1)NUMPY SOLUTION,常规列表
如果您很乐意使用numpy,那么以下内容将适用于常规列表(排序或未排序):
numpy.argwhere(np.array(searchlist)>x)[0]
或者如果您需要答案作为列表:
numpy.argwhere(np.array(searchlist)>x).tolist()[0]
或者如果您需要答案作为整数索引:
numpy.argwhere(np.array(searchlist)>x).tolist()[0][0]
2)NUMPY SOLUTION,排序列表
但是,如果您的搜索列表已排序,则使用功能np.searchsorted会更加简洁明了:
numpy.searchsorted(searchlist,x)
使用此函数的好处是,除了搜索单个值x之外,您还可以返回索引列表以获取值x的列表(在这种情况下,相对于列表理解而言,这非常有效)。
>>> 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
您也可以使用numpy
:
import numpy as np
list(np.array(SearchList) > x).index(True)
试试这个:
def Renumerate(l):
return [(len(l) - x, y) for x,y in enumerate(l)]
示例代码:
Renumerate(range(10))
输出:
(10, 0)
(9, 1)
(8, 2)
(7, 3)
(6, 4)
(5, 5)
(4, 6)
(3, 7)
(2, 8)
(1, 9)