>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
from itertools import izip as zip, count # izip for maximum efficiency
[i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']
对于较大的列表,这比使用enumerate()更有效:
$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 196 usec per loop
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
在学习Python时,有一点非常有用,那就是使用交互式帮助函数:
这通常会引导你找到你想要的方法。
大多数答案解释了如何查找单个索引,但如果该项多次出现在列表中,则它们的方法不会返回多个索引。使用^{} :
函数
index()
只返回第一个匹配项,而enumerate()
返回所有匹配项。作为列表理解:
这里还有另一个使用^{} (与枚举方法几乎相同)的小解决方案:
对于较大的列表,这比使用
enumerate()
更有效:引用:Data Structures > More on Lists
注意事项如下
请注意,虽然这可能是回答问题的最干净的方法,但是
index
是list
API的一个相当弱的组件,我记不起上一次愤怒地使用它。有人在评论中向我指出,因为这个答案被大量引用,所以应该更加完整。下面是一些关于list.index
的注意事项。最初可能值得看一下它的docstring:列表长度的线性时间复杂度
一个
index
调用按顺序检查列表中的每个元素,直到找到匹配项为止。如果您的列表很长,而且您不知道它在列表中的大致位置,则此搜索可能会成为瓶颈。在这种情况下,您应该考虑不同的数据结构。注意,如果您大致知道在哪里找到匹配项,那么可以给index
一个提示。例如,在这个片段中,l.index(999_999, 999_990, 1_000_000)
大约比直接的l.index(999_999)
快五个数量级,因为前者只需搜索10个条目,而后者则搜索一百万个条目:只将第一个匹配项的索引返回给它的参数
对
index
的调用按顺序搜索列表,直到找到匹配项,然后在那里停止。如果希望需要更多匹配项的索引,则应使用列表理解或生成器表达式。在我曾经使用过
index
的大多数地方,我现在使用列表理解或生成器表达式,因为它们更通用。因此,如果您正在考虑使用index
,请查看这些优秀的python特性。引发if元素不在列表中
如果项目不存在,则调用
index
将导致ValueError
。如果该项可能不在列表中,则应
item in my_list
(干净的、可读的方法)检查它,或者index
调用包装在捕获ValueError
的try/except
块中(可能更快,至少当要搜索的列表很长,并且该项通常存在时)相关问题 更多 >
编程相关推荐