在列表中查找项目的索引注意事项如下

2022-09-05 00:41:45

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


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

参考:数据结构>列表的更多信息

注意事项如下

请注意,虽然这可能是回答所提问题的最干净的方式,但它是API中一个相当弱的组件,我不记得我上次愤怒地使用它的时间。有人在评论中向我指出,由于这个答案被大量引用,所以应该使它更加完整。关于跟随的一些警告。最初可能值得一看它的文档:indexlistlist.index

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

在值等于 x 的第一项的列表中返回从零开始索引。如果没有此类项则引发值错误。

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

列表长度的线性时间复杂度

调用按顺序检查列表的每个元素,直到找到匹配项。如果您的列表很长,并且您不知道它出现在列表中的大致位置,则此搜索可能会成为瓶颈。在这种情况下,应考虑使用不同的数据结构。请注意,如果您大致知道在哪里可以找到匹配项,则可以给出提示。例如,在此代码段中,比直线快大约五个数量级,因为前者只需要搜索10个条目,而后者搜索100万个条目:indexindexl.index(999_999, 999_990, 1_000_000)l.index(999_999)

>>> 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

我曾经使用的大多数地方,我现在使用列表理解或生成器表达式,因为它们更容易推广。因此,如果您正在考虑达到,请查看这些出色的Python功能。indexindex

如果列表中不存在元素,则抛出

对项不存在的调用将生成 ValueErrorindex

>>> [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. 将调用包装在捕获的块中(可能更快,至少在要搜索的列表很长并且项目通常存在时。indextry/exceptValueError

答案 2

在学习Python中真正有帮助的一件事是使用交互式帮助功能:

>>> help(["foo", "bar", "baz"])
Help on list object:

class list(object)
 ...

 |
 |  index(...)
 |      L.index(value, [start, [stop]]) -> integer -- return first index of value
 |

这通常会引导您找到所需的方法。