为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ITMISS 2019-06-01 16:31:46
在Python中查找给定包含它的列表的项的索引一份清单["foo", "bar", "baz"]和清单上的一个项目"bar",如何在Python中获得它的索引(1)?
查看完整描述

4 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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

参考资料:数据结构>列表中的更多内容

注意事项如下

请注意,虽然这也许是回答问题的最干净的方法按要求indexlistAPI,我不记得上次我愤怒地使用它是什么时候了。我在评论中指出,由于这个答案被大量引用,所以它应该更完整。关于list.index跟着。可能值得一开始看一下它的docstring:

>>> print(list.index.__doc__)L.index(value, [start, [stop]]) -> integer -- return first index of value.Raises ValueError if the value is
 not present.

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

index调用检查列表中的每个元素,直到找到匹配为止。如果您的列表很长,并且您不知道列表中的内容在哪里发生,则此搜索可能成为瓶颈。在这种情况下,您应该考虑不同的数据结构。请注意,如果您大致知道在哪里找到匹配,您可以给index暗示一下。例如,在这个片段中,l.index(999_999, 999_990, 1_000_000)大约比直线快5个数量级l.index(999_999),因为前者只需搜索10个条目,而后者只需搜索100万条:

>>> 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特性。

抛出列表中不存在的if元素。

打电话给index结果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

    (可能更快,至少当要搜索的列表很长时,并且项目通常是存在的。)


查看完整回答
反对 回复 2019-06-01
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

在学习Python时真正有帮助的一件事是使用交互式帮助函数:

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

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

这通常会引导你找到你想要的方法。


查看完整回答
反对 回复 2019-06-01
?
DIEA

TA贡献1820条经验 获得超2个赞

大多数答案解释了如何找到单一指数,但如果项目多次出现在列表中,则它们的方法不会返回多个索引。使用enumerate():

for i, j in enumerate(['foo', 'bar', 'baz']):
    if j == 'bar':
        print(i)

这个index()函数只返回第一个匹配项,而enumerate()返回所有事件。

作为一种清单理解:

[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']

这里还有另一个小解决方案itertools.count()(这与枚举方法基本相同):

from itertools import izip as zip, count # izip for maximum efficiency[i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']

对于较大的列表来说,这比使用enumerate():

$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"10000
 loops, best of 3: 174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"10000 loops, best of 3: 196 usec per loop


查看完整回答
反对 回复 2019-06-01
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

若要获取所有索引,请执行以下操作:

 indexes = [i for i,x in enumerate(xs) if x == 'foo']


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 716 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信