在没有循环的情况下,在python中返回列表索引的优雅方法是什么?

时间:2017-01-31 04:01:33

标签: python list

说我有一个列表t = list(i for i in np.arange(0.5,10.5,0.5))。我想在s=[3,5,7]中找到t的索引位置。我知道我可以通过t.index(s)循环来做到这一点,但有更优雅的方式吗?

1 个答案:

答案 0 :(得分:5)

重要的是要意识到你总是需要一些循环。即使t.index做了一个循环,它只是隐藏它!但是据我所知,Python标准库中没有任何函数可以避免s上的显式循环。

然而,人们可以提高效率(我的意思是比[t.index(needle) for needle in s]更有效率)!特别是如果您的列表已排序。

您已使用NumPy,因此np.searchsorted肯定会很快:

import numpy as np

t = np.arange(0.5,10.5,0.5)
s = [3, 5, 7]

np.searchsorted(t, s)

如果你想留在Python中,还有bisect模块,它至少可以保存一些(隐式)循环:

from bisect import bisect_left

def index(a, x):  # Taken from the bisect documentation
    'Locate the leftmost value exactly equal to x'
    i = bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError

indices = [index(t, needle) for needle in s]