在列表中找到大于x的第一个索引的最Pythonic方法是什么?
例如,使用
list = [0.5, 0.3, 0.9, 0.8]
功能
f(list, 0.7)
将返回
2.
答案 0 :(得分:78)
next(x[0] for x in enumerate(L) if x[1] > 0.7)
答案 1 :(得分:19)
如果列表已排序,则bisect_left(alist, value)
对于大型列表而言比next(i for i, x in enumerate(alist) if x >= value)
更快。
答案 2 :(得分:13)
filter(lambda x: x>.7, seq)[0]
答案 3 :(得分:10)
>>> alist= [0.5, 0.3, 0.9, 0.8]
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0]
2
答案 4 :(得分:5)
for index, elem in enumerate(elements):
if elem > reference:
return index
raise ValueError("Nothing Found")
答案 5 :(得分:3)
另一个:
map(lambda x: x>.7, seq).index(True)
答案 6 :(得分:2)
1)numpy解决方案,常规列表
如果您很乐意使用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)数字解决方案,已排序列表
但是,如果对搜索列表进行了排序,则使用功能np.searchsorted会更加简洁明了:
numpy.searchsorted(searchlist,x)
使用此函数的好处是,除了搜索单个值x之外,还可以返回索引列表以获取值x的列表(and it is very efficient relative to a list comprehension in this case)。
答案 7 :(得分:1)
当我的名单很长时,我遇到了类似的问题。理解或基于过滤器的解决方案将通过整个列表。一旦条件第一次变为假,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)
答案 8 :(得分:0)
>>> 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
答案 9 :(得分:0)
我知道已经有很多答案了,但是有时候我觉得pythonic这个词被翻译成“单线”。
当我认为更好的定义更接近this answer时:
“利用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程序员接受。
我认为写dumb code是积极的。
答案 10 :(得分:0)
尝试这个:
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)
答案 11 :(得分:0)
您也可以使用numpy
进行此操作:
import numpy as np
list(np.array(SearchList) > x).index(True)