查找列表中项目的索引

2024-05-16

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


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

See 文档 https://docs.python.org/tutorial/datastructures.html#more-on-lists对于内置的.index()列表方法:

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

返回列表中第一个项目的从零开始的索引,其值等于x。提出一个ValueError https://docs.python.org/library/exceptions.html#ValueError如果没有这样的项目。

可选参数start and end被解释为切片表示法 https://docs.python.org/tutorial/introduction.html#lists和 用于将搜索限制为列表的特定子序列。返回的索引是相对于完整序列的开头而不是起始参数计算的。

Caveats

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

An indexcall 按顺序检查列表中的每个元素,直到找到匹配项。如果列表很长,并且不能保证该值将接近开头,这可能会减慢代码速度。

这个问题只能通过使用不同的数据结构才能完全避免。但是,如果已知该元素位于列表的某个部分内,则start and end可以使用参数来缩小搜索范围。

例如:

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

第二次调用速度快了几个数量级,因为它只需搜索 10 个元素,而不是全部 100 万个元素。

仅索引第一场比赛被返回

致电index按顺序搜索列表,直到找到匹配项,并且停在那里。如果该值可能出现多次,并且需要所有索引,index无法解决问题:

>>> [1, 1].index(1) # the `1` index is not found.
0

相反,使用列表理解或生成器表达式进行搜索 /questions/34835951/, with enumerate获取索引 /questions/522563/:

>>> # A list comprehension gives a list of indices directly:
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> # A generator comprehension gives us an iterable object...
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> # which can be used in a `for` loop, or manually iterated with `next`:
>>> next(g)
0
>>> next(g)
2

如果只有一个匹配,列表理解和生成器表达式技术仍然有效,并且更通用。

如果没有匹配则引发异常

如上面的文档中所述,使用.index如果搜索的值不在列表中,将引发异常:

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

如果这是一个问题,或者首先明确检查 https://stackoverflow.com/questions/12934190 using item in my_list,或处理异常try/except作为适当的。

显式检查简单且可读,但必须再次迭代列表。看Python中的EAFP原理是什么? https://stackoverflow.com/questions/11360858有关此选择的更多指导。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找列表中项目的索引 的相关文章

随机推荐