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

c00*_*ter 68 python list

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

例如,用

list = [0.5, 0.3, 0.9, 0.8]
Run Code Online (Sandbox Code Playgroud)

功能

f(list, 0.7)
Run Code Online (Sandbox Code Playgroud)

会回来的

2.
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 93

next(x[0] for x in enumerate(L) if x[1] > 0.7)
Run Code Online (Sandbox Code Playgroud)

  • 简化为+1和`next()`,但这可能是为了便于阅读:`next(i代表i,v代表枚举(L),如果v> 0.7) (30认同)
  • +1:虽然我更愿意避免使用幻数:next(idx表示idx,如果值> 0.7,则枚举值(L)) (27认同)
  • 虽然看起来不错,但没有结果的情况会引起令人困惑的StopIteration. (7认同)
  • @Wim:但是你回归到评估整个序列.使用`itertools.chain()`而不是像这样添加列表. (3认同)
  • @c00kiemonster 不,next() 只是获取迭代器的第一项。但是迭代器被过滤了,所以第一项是正确的项。 (2认同)
  • @flybywire:`next()`是2.6+.在早期版本中调用genex的`next()`方法. (2认同)
  • @Wim您在这里不需要chain()。next()接受第二个参数:`next((i为i,如果x> value,则为enumerate(L)中的x),-1)` (2认同)

jfs*_*jfs 22

如果列表是排序的,那么bisect_left(alist, value)对于大型列表来说比这更快next(i for i, x in enumerate(alist) if x >= value).

  • @AdrianTompkins:你的基准有问题。bisect_left 的复杂度为 O(log n),而 listcomp 的复杂度为 O(n),即 n 越大,bisect_left() 一侧的优势越大。我尝试使用 `bisect_left()` -> 3.75 微秒并使用带有 `next()`-> 51.0 毫秒 [`10_000` 次的geneexpr 在 `range(10**6)` 中查找 `500_000` 的索引] 正如预期的那样慢。 (2认同)

fly*_*ire 14

filter(lambda x: x>.7, seq)[0]
Run Code Online (Sandbox Code Playgroud)

  • python 3中的@truppo过滤器返回一个生成器,所以它应该不比列表理解差吗?此外,我发现这种方式比枚举解决方案更具可读性. (4认同)
  • -1:虽然技术上正确,但是不要使用过滤器,其中列表理解更具可读性和更高性能 (2认同)

gho*_*g74 10

>>> alist= [0.5, 0.3, 0.9, 0.8]
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0]
2
Run Code Online (Sandbox Code Playgroud)

  • 如果'x'大于列表中的任何其他值,它将失败 (2认同)
  • @mshsayem:对于这种情况,问题定义不明确。失败可能是正确的做法。 (2认同)

Vir*_*ras 7

for index, elem in enumerate(elements):
    if elem > reference:
        return index
raise ValueError("Nothing Found")
Run Code Online (Sandbox Code Playgroud)


fly*_*ire 5

另一个:

map(lambda x: x>.7, seq).index(True)
Run Code Online (Sandbox Code Playgroud)


Adr*_*ins 5

1) NUMPY ARGWHERE,一般列表

如果您乐于使用 numpy(在此处作为np导入),那么以下内容将适用于一般列表(已排序或未排序):

np.argwhere(np.array(searchlist)>x)[0]
Run Code Online (Sandbox Code Playgroud)

或者如果您需要作为整数索引的答案:

np.argwhere(np.array(searchlist)>x)[0][0]
Run Code Online (Sandbox Code Playgroud)

2) NUMPY SEARCHSORTED,排序列表(在列表中搜索列表非常有效)

但是,如果您的搜索列表已排序,则使用函数np.searchsorted 会更简洁、更好:

np.searchsorted(searchlist,x)
Run Code Online (Sandbox Code Playgroud)

使用此函数的好处在于,除了搜索单个值 x 外,您还可以搜索列表 x,即您还可以返回搜索值列表的索引列表 [x1,x2,x3.. xn] ,(在这种情况下,它相对于列表理解非常有效)。