猿问

在Python中查找给定包含它的列表的项的索引

在Python中查找给定包含它的列表的项的索引

一份清单["foo", "bar", "baz"]和清单上的一个项目"bar",如何在Python中获得它的索引(1)?



ITMISS
浏览 717回答 4
4回答

幕布斯6054654

>>>&nbsp;["foo",&nbsp;"bar",&nbsp;"baz"].index("bar") 1参考资料:数据结构>列表中的更多内容注意事项如下请注意,虽然这也许是回答问题的最干净的方法按要求,&nbsp;index是listAPI,我不记得上次我愤怒地使用它是什么时候了。我在评论中指出,由于这个答案被大量引用,所以它应该更完整。关于list.index跟着。可能值得一开始看一下它的docstring:>>>&nbsp;print(list.index.__doc__)L.index(value,&nbsp;[start,&nbsp;[stop]])&nbsp;->&nbsp;integer&nbsp;--&nbsp;return&nbsp;first&nbsp;index&nbsp;of&nbsp;value.Raises&nbsp;ValueError&nbsp;if&nbsp;the&nbsp;value&nbsp;is &nbsp;not&nbsp;present.列表长度的线性时间复杂度阿index调用检查列表中的每个元素,直到找到匹配为止。如果您的列表很长,并且您不知道列表中的内容在哪里发生,则此搜索可能成为瓶颈。在这种情况下,您应该考虑不同的数据结构。请注意,如果您大致知道在哪里找到匹配,您可以给index暗示一下。例如,在这个片段中,l.index(999_999, 999_990, 1_000_000)大约比直线快5个数量级l.index(999_999),因为前者只需搜索10个条目,而后者只需搜索100万条:>>>&nbsp;import&nbsp;timeit>>>&nbsp;timeit.timeit('l.index(999_999)',&nbsp;setup='l&nbsp;=&nbsp;list(range(0,&nbsp;1_000_000))',&nbsp;number=1000)9.356267921015387 >>>&nbsp;timeit.timeit('l.index(999_999,&nbsp;999_990,&nbsp;1_000_000)',&nbsp;setup='l&nbsp;=&nbsp;list(range(0,&nbsp;1_000_000))',&nbsp;number=1000)0.0004404920036904514只返回第一场比赛对其论点打电话给index搜索列表,直到找到匹配为止,并且停在那里。如果您希望需要更多匹配的索引,则应该使用列表理解或生成器表达式。>>>&nbsp;[1,&nbsp;1].index(1)0>>>&nbsp;[i&nbsp;for&nbsp;i,&nbsp;e&nbsp;in&nbsp;enumerate([1,&nbsp;2,&nbsp;1])&nbsp;if&nbsp;e&nbsp;==&nbsp;1][0,&nbsp;2]>>>&nbsp;g&nbsp;=&nbsp;(i&nbsp;for&nbsp;i,&nbsp;e&nbsp;in&nbsp;enumerate([1,&nbsp;2,&nbsp;1])&nbsp;if&nbsp;e&nbsp;==&nbsp;1) >>>&nbsp;next(g)0>>>&nbsp;next(g)2大多数我曾经用过的地方index,我现在使用列表理解或生成器表达式,因为它们更具有通用性。所以如果你在考虑index,看看这些优秀的python特性。抛出列表中不存在的if元素。打电话给index结果ValueError如果物品不存在的话。>>>&nbsp;[1,&nbsp;1].index(2)Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>ValueError:&nbsp;2&nbsp;is&nbsp;not&nbsp;in&nbsp;list如果该项目可能不在列表中,则应选择先检查一下item in my_list(清洁、可读的方法),或包好index打电话try/except捕获块ValueError(可能更快,至少当要搜索的列表很长时,并且项目通常是存在的。)

红糖糍粑

在学习Python时真正有帮助的一件事是使用交互式帮助函数:>>>&nbsp;help(["foo",&nbsp;"bar",&nbsp;"baz"])Help&nbsp;on&nbsp;list&nbsp;object:class&nbsp;list(object) &nbsp;... &nbsp;| &nbsp;|&nbsp;&nbsp;index(...) &nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L.index(value,&nbsp;[start,&nbsp;[stop]])&nbsp;->&nbsp;integer&nbsp;--&nbsp;return&nbsp;first&nbsp;index&nbsp;of&nbsp;value&nbsp;|这通常会引导你找到你想要的方法。

DIEA

大多数答案解释了如何找到单一指数,但如果项目多次出现在列表中,则它们的方法不会返回多个索引。使用enumerate():for&nbsp;i,&nbsp;j&nbsp;in&nbsp;enumerate(['foo',&nbsp;'bar',&nbsp;'baz']): &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;j&nbsp;==&nbsp;'bar': &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(i)这个index()函数只返回第一个匹配项,而enumerate()返回所有事件。作为一种清单理解:[i&nbsp;for&nbsp;i,&nbsp;j&nbsp;in&nbsp;enumerate(['foo',&nbsp;'bar',&nbsp;'baz'])&nbsp;if&nbsp;j&nbsp;==&nbsp;'bar']这里还有另一个小解决方案itertools.count()(这与枚举方法基本相同):from&nbsp;itertools&nbsp;import&nbsp;izip&nbsp;as&nbsp;zip,&nbsp;count&nbsp;#&nbsp;izip&nbsp;for&nbsp;maximum&nbsp;efficiency[i&nbsp;for&nbsp;i,&nbsp;j&nbsp;in&nbsp;zip(count(),&nbsp;['foo',&nbsp;'bar',&nbsp;'baz'])&nbsp;if&nbsp;j&nbsp;==&nbsp;'bar']对于较大的列表来说,这比使用enumerate():$&nbsp;python&nbsp;-m&nbsp;timeit&nbsp;-s&nbsp;"from&nbsp;itertools&nbsp;import&nbsp;izip&nbsp;as&nbsp;zip,&nbsp;count"&nbsp;"[i&nbsp;for&nbsp;i,&nbsp;j&nbsp;in&nbsp;zip(count(),&nbsp;['foo',&nbsp;'bar',&nbsp;'baz']*500)&nbsp;if&nbsp;j&nbsp;==&nbsp;'bar']"10000 &nbsp;loops,&nbsp;best&nbsp;of&nbsp;3:&nbsp;174&nbsp;usec&nbsp;per&nbsp;loop $&nbsp;python&nbsp;-m&nbsp;timeit&nbsp;"[i&nbsp;for&nbsp;i,&nbsp;j&nbsp;in&nbsp;enumerate(['foo',&nbsp;'bar',&nbsp;'baz']*500)&nbsp;if&nbsp;j&nbsp;==&nbsp;'bar']"10000&nbsp;loops,&nbsp;best&nbsp;of&nbsp;3:&nbsp;196&nbsp;usec&nbsp;per&nbsp;loop

慕桂英3389331

若要获取所有索引,请执行以下操作:&nbsp;indexes&nbsp;=&nbsp;[i&nbsp;for&nbsp;i,x&nbsp;in&nbsp;enumerate(xs)&nbsp;if&nbsp;x&nbsp;==&nbsp;'foo']
随时随地看视频慕课网APP

相关分类

Python
我要回答