第一个Python列表索引大于x?

时间:2010-02-10 13:01:40

标签: python list

在列表中找到大于x的第一个索引的最Pythonic方法是什么?

例如,使用

list = [0.5, 0.3, 0.9, 0.8]

功能

f(list, 0.7)

将返回

2.

12 个答案:

答案 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)