一尘不染

查找列表中项目的索引

python

给定一个列表["foo", "bar", "baz"]和列表中的一个项目,"bar"我如何1在 Python 中获取它的索引 ( )?


阅读 169

收藏
2022-01-12

共1个答案

一尘不染

>>> ["foo", "bar", "baz"].index("bar")
1

参考:数据结构 > 更多关于列表

警告如下
请注意,虽然这也许是回答这个问题最彻底的方法是问,index是一个相当薄弱的组件listAPI,而我不记得我最后一次使用它的愤怒。评论中已向我指出,由于此答案被大量引用,因此应使其更加完整。关于list.index跟随的一些注意事项。最初可能值得看一下它的文档:

list.index(x[, start[, end]])

返回值等于x的第一项的列表中从零开始的索引。ValueError如果没有这样的项目,则引发 a 。

可选参数start和end被解释为切片符号,用于将搜索限制为列表的特定子序列。返回的索引是相对于完整序列的开头而不是 start 参数计算的。

列表长度的线性时间复杂度
一个index调用检查,以列表的每一个元素,直到它找到一个匹配。如果您的列表很长,并且您不知道它在列表中的大致位置,则此搜索可能会成为瓶颈。在这种情况下,您应该考虑不同的数据结构。请注意,如果您大致知道在哪里可以找到匹配项,您可以给出index提示。例如,在这个片段中,l.index(999_999, 999_990, 1_000_000)大约比 Straight 快五个数量级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结果为a ValueError

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 2 is not in list

如果该项目可能不在列表中,您应该

  1. 首先使用item in my_list(干净,可读的方法)检查它,或者
  2. 将index调用包装在一个try/except可以捕获的块中ValueError(可能更快,至少当要搜索的列表很长并且该项目通常存在时。)
2022-01-12