>>> ["foo", "bar", "baz"].index("bar")
1
警告如下
请注意,虽然这可能是回答问题的最简洁方法,但索引是列表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.
列表长度的线性时间复杂度
索引调用按顺序检查列表中的每个元素,直到找到匹配项.如果您的列表很长,并且您不知道列表中的大致位置,则此搜索可能会成为瓶颈.在这种情况下,您应该考虑不同的数据结构.请注意,如果您大致知道匹配的位置,则可以为索引提供提示.例如,在这个片段中,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
仅将第一个匹配的索引返回到其参数
对索引的调用按顺序搜索列表,直到找到匹配项,然后停在那里.如果您希望需要更多匹配的索引,则应使用列表推导或生成器表达式.
>>> [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的调用会导致ValueError.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "", line 1, in
ValueError: 2 is not in list
如果该项目可能不在列表中,您应该
>首先使用my_list中的项目(干净,可读的方法)检查??它,或者
>将索引调用包装在try / except块中,该块捕获ValueError(可能更快,至少当搜索列表很长时,该项通常存在.)