>>> ["foo", "bar", "baz"].index("bar")
1
参考: 数据结构 > 更多列表
请注意,虽然这也许是回答, 因为问的问题最彻底的方法, index
是一个相当薄弱的组件list
API,我不记得我最后一次使用它的愤怒。在评论中已经向我指出,因为这个答案被大量引用,所以应该更加完整。关于list.index
一些警告如下。最初可能需要查看文档字符串:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
index
调用按顺序检查列表中的每个元素,直到找到匹配项。如果您的列表很长,而且您不清楚列表中的大致位置,则此搜索可能会成为瓶颈。在这种情况下,您应该考虑不同的数据结构。请注意,如果您大致知道匹配的位置,则可以为index
提供提示。例如,在这个片段中, l.index(999_999, 999_990, 1_000_000)
比直接l.index(999_999)
快大约五个数量级,因为前者只需搜索 10 个条目,而后者搜索一百万个:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
对index
的调用按顺序搜索列表,直到找到匹配项,然后停在那里。如果您希望需要更多匹配的索引,则应使用列表推导或生成器表达式。
>>> [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
我曾经使用过index
大多数地方,我现在使用列表推导或生成器表达式,因为它们更具有推广性。因此,如果您正在考虑使用index
,请查看这些出色的 python 功能。
如果项目不存在,则对index
的调用会导致ValueError
。
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
如果该项目可能不在列表中,您应该
item in my_list
检查它(干净,可读的方法),或index
调用包装在try/except
块中,该块捕获ValueError
(可能更快,至少当搜索列表很长时,该项通常存在。) 学习 Python 真正有用的一件事是使用交互式帮助功能:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
这通常会引导您找到您正在寻找的方法。
大多数答案解释了如何查找单个索引 ,但如果项目在列表中多次,则它们的方法不会返回多个索引。使用enumerate()
:
for i, j in enumerate(['foo', 'bar', 'baz']):
if j == 'bar':
print(i)
index()
函数仅返回第一个匹配项,而enumerate()
返回所有匹配项。
作为列表理解:
[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']
这是使用itertools.count()
另一个小解决方案(这与枚举几乎相同):
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