题 在Python中查找包含它的列表的项目索引


列表 ["foo", "bar", "baz"] 和列表中的项目 "bar",如何在Python中获取其索引(1)?


2247
2017-10-07 01:39


起源


您是否返回:[1]如果有多个实例,则为最低索引 "bar",[2]所有指数 "bar"? - Mulliganaceous
a)是否保证该项目在列表中,或者我们应该如何处理错误案例? (返回None / raise ValueError)b)列表条目是否保证唯一,是否应返回匹配的第一个索引或所有索引? - smci


答案:


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

参考: 数据结构>更多列表

警告如下

请注意,虽然这可能是回答问题的最简洁方法 按照要求index 是一个相当薄弱的组成部分 list API,我不记得上次我在愤怒中使用它了。在评论中已经向我指出,因为这个答案被大量引用,所以应该更加完整。一些警告 list.index 跟随。最初可能需要查看文档字符串:

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

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

一个 index call按顺序检查列表中的每个元素,直到找到匹配项。如果您的列表很长,而且您不清楚列表中的大致位置,则此搜索可能会成为瓶颈。在这种情况下,您应该考虑不同的数据结构。请注意,如果你大致知道在哪里找到匹配,你可以给 index 一个提示。例如,在这个片段中, l.index(999_999, 999_990, 1_000_000) 比直线快约五个数量级 l.index(999_999),因为前者只需搜索10个条目,而后者搜索一百万条:

>>> 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功能。

如果元素不在列表中,则抛出

打电话给 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 (可能更快,至少当搜索列表很长时,项目通常存在。)

3308
2017-10-07 01:40



请注意,如果它不在列表中,则会抛出错误! - JokerMartini
index返回值为“bar”的第一个项目。如果“bar”在列表中存在两次,您将永远找不到第二个“bar”的键。见文档: docs.python.org/3/tutorial/datastructures.html - mpoletto
如何为numpy数组做这个? - Hendy Irawan
问题中规定该项目在列表中。 - Alex Coventry
@smci,谢谢你指出这一点。 - Alex Coventry


学习Python真正有用的一件事是使用交互式帮助功能:

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

class list(object)
 ...

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

这通常会引导您找到您正在寻找的方法。


786
2017-10-07 13:19





大多数答案解释了如何找到 一个索引,但是如果项目在列表中多次,则它们的方法不会返回多个索引。使用 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

446
2018-06-19 22:31



枚举比基于索引的方法更适合我,因为我想用'startswith'收集字符串的索引,我需要收集多次出现。或者有没有办法使用索引“startswith”我想不通 - Tupelo Thistlehead
在我手中,枚举版本一直略快。自上面的测量发布以来,一些实施细节可能已经改变。 - Alex Coventry
@AlexCoventry高度依赖于计算机规格,但差不多五年(哇哇哇),我倾向于同意你的看法。特别是从 izip 用python 3做了多余的事情 - TerryA


获取所有索引:

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

123
2018-06-25 15:07





index()返回 第一 价值指数!

|指数(...)
   | L.index(value,[start,[stop]]) - > integer - 返回第一个值的索引

def all_indices(value, qlist):
    indices = []
    idx = -1
    while True:
        try:
            idx = qlist.index(value, idx+1)
            indices.append(idx)
        except ValueError:
            break
    return indices

all_indices("foo", ["foo","bar","baz","foo"])

105
2017-08-30 09:40



如果列表中不存在? - Peter Mortensen
你试图运行代码看看它返回什么? :-) - HongboZhu


如果元素不在列表中,则会出现问题。此函数处理问题:

# if element is found it returns index of element else returns None

def find_element_in_list(element, list_element):
    try:
        index_element = list_element.index(element)
        return index_element
    except ValueError:
        return None

67
2018-04-16 10:19





a = ["foo","bar","baz",'bar','any','much']

indexes = [index for index in range(len(a)) if a[index] == 'bar']

57
2017-08-21 12:01



'item'是一个非常具有误导性的变量名称。 '指数'可能吗? - johan d.


您必须设置条件以检查您要搜索的元素是否在列表中

if 'your_element' in mylist:
    print mylist.index('your_element')
else:
    print None

39
2018-05-26 04:26