在列表中查找项的索引

  • 问题:
  • 给定一个列表[“foo”,“bar”,“baz”]和列表“bar”中的一个项目,如何在Python中获得其索引(1)?在

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

    参考文献:Data Structures > More on Lists

    请注意,虽然这可能是回答问题的最干净的方法,但索引列表API中一个相当薄弱的组件,我不记得上次我愤怒地使用它是什么时候了。有人在评论中向我指出,因为这个答案被大量引用,所以它应该更加完整。关于列表.索引跟随。可能值得首先查看一下相关文档:

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

    返回值等于x的第一项列表中从零开始的索引。引发ValueError如果没有这样的项目

    可选参数startend解释为slice notation和用于将搜索限制到列表的特定子序列。返回的索引是相对于完整序列的开始而不是相对于start参数计算的

    索引调用按顺序检查列表中的每个元素,直到找到匹配项。如果您的列表很长,并且您不知道它在列表中的哪个位置,则此搜索可能会成为一个瓶颈。在这种情况下,您应该考虑不同的数据结构。请注意,如果您大致知道在何处找到匹配项,则可以给index一个提示。例如,在这个片段中,l.index(999ϧ990,1_000_000)大约比直接的l.index(999_999)快5个数量级,因为前者只需搜索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的大多数地方,我现在使用列表理解或生成器表达式,因为它们更具通用性。因此,如果您正在考虑使用索引,可以看看这些优秀的Python特性

    调用索引会导致ValueError如果物品不存在

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

    如果该项可能不在列表中,则应该