回答

收藏

查找列表中项目的索引

技术问答 技术问答 580 人阅读 | 0 人回复 | 2023-09-11

给出列表["foo","bar","baz"]列表中的一个项目,"bar"我如何1在 Python 中索引 ( )?
. \, Y4 L2 [$ A/ m                                                                / ~/ t) h/ B& t/ s5 Y  L, s% \
    解决方案:                                                                / M' a6 p+ y& m; q& L
                                                                >>> ["foo","bar","baz"].index("bar")1参考:数据结构 > 列表更多/ Z, y( Q! t1 y' ?
警告如下) G: h* v' `. A
请注意,这可能是回答这个问题最彻底的方法,index它是一个相当薄弱的组件listAPI,而我不记得我最后一次使用它的愤怒。评论中已向我指出,由于此答案被大量引用,因此应使其更加完整。关于list.index跟进一些注意事项。一开始可能值得一看:
9 E8 l3 T! A, }7 N) v: H2 i8 ]list.index(x[,start[,end]])返回值等于x索引从零开始在第一项列表中。ValueError如果没有这样的项目,会导致 a 。. i* k$ \' \4 X
可选参数start和end将搜索限制为列表的特定子序列解释为切片符号。返回的索引是相对于完整序列的开头,而不是 start 参数计算。
* n2 b6 h  H! T) [( p2 R列表长度的线性时间复杂度4 @$ D/ B; `4 @  J9 b, [. U
一个index调用检查列表中的每个元素,直到它找到匹配。如果你的列表很长,你不知道它在列表中的一般位置,搜索可能会成为瓶颈。在这种情况下,您应该考虑不同的数据结构。请注意,如果您大致知道在哪里可以找到匹配项,您可以给出它index提示。例如,在这个片段中,l.index(999_999,999_990,1_000_000)大约比 Straight 快五个数量级l.index(999_999)因为前者只需要搜索 10个项目,后者搜索100万个项目:
: V" `* {! P+ S/ P>>> 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只将第一个匹配项的索引返回到其参数0 K3 P7 t* |! O# Z& M
调用index按顺序搜索列表,直到找到匹配项,然后停在那里。如果您想要更多的匹配项索引,请使用列表推导或生成器表达。
  R" m! @. p  h$ X) s- h% ^- G>>> [1,1].index(1)0>>> [i for i,e in enumerate if e == 1][0,2]>>> g = (i for i,e in enumerate if e == 1)>>> next(g)0>>> next(g)2我用过的大部分地方我都用过。index,现在我使用列表推导式或生成器表达式,因为它们更常见。因此,如果你正在考虑使用它们index,请查看这些优秀的 Python 功能。
: d; t; F$ I0 u% p如果列表中不存在元素,则抛出项目不存在,则调用index结果为a ValueError。
' i" O7 Z/ b/ Z- P1 t/ c0 U  c>>> [1,1].index(2)Traceback (most recent call last):  File "",line 1,in ValueError: 2 is not in list如果项目可能不在列表中,你应该
2 j- k" W0 F$ x* N1 k[ol]首先使用item in my_list(干净可读的方法)检查它,或者- l$ d0 q' h& k; m
将index一个调用包装try/except可捕获的块中ValueError(可能更快,至少当搜索列表很长,项目通常存在时。[/ol]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则