在列表中查找项目的索引 [英] Finding the index of an item in a list
问题描述
给出列表["foo", "bar", "baz"]
和列表"bar"
中的项目,如何在Python中获取其索引(1
)?
>>> ["foo", "bar", "baz"].index("bar")
1
参考:数据结构>列表中的更多信息 >
注意事项
请注意,虽然这也许是回答问题 的最干净的方法,但是index
是list
API的一个相当弱的组件,我不记得上一次了我很生气.在评论中已向我指出,由于此答案被大量引用,因此应使其更完整.有关list.index
的一些警告.最初值得一看它的文档可能是值得的:
list.index(x[, start[, end]])
返回值等于 x 的第一项列表中的从零开始的索引.如果没有这样的项目,则引发
ValueError
.可选参数 start 和 end 的解释方式与
ValueError
该商品不存在.>>> [1, 1].index(2) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 2 is not in list
如果该项目可能不存在于列表中,则您应该
- 首先使用
item in my_list
(干净,可读的方法)进行检查,或者- 将
index
调用包装在捕获ValueError
的try/except
块中(可能更快,至少在要搜索的列表较长且通常存在该项目的情况下).Given a list
["foo", "bar", "baz"]
and an item in the list"bar"
, how do I get its index (1
) in Python?解决方案>>> ["foo", "bar", "baz"].index("bar") 1
Reference: Data Structures > More on Lists
Caveats follow
Note that while this is perhaps the cleanest way to answer the question as asked,
index
is a rather weak component of thelist
API, and I can't remember the last time I used it in anger. It's been pointed out to me in the comments that because this answer is heavily referenced, it should be made more complete. Some caveats aboutlist.index
follow. It is probably worth initially taking a look at the documentation for it:list.index(x[, start[, end]])
Return zero-based index in the list of the first item whose value is equal to x. Raises a
ValueError
if there is no such item.The optional arguments start and end are interpreted as in the slice notation and are used to limit the search to a particular subsequence of the list. The returned index is computed relative to the beginning of the full sequence rather than the start argument.
Linear time-complexity in list length
An
index
call checks every element of the list in order, until it finds a match. If your list is long, and you don't know roughly where in the list it occurs, this search could become a bottleneck. In that case, you should consider a different data structure. Note that if you know roughly where to find the match, you can giveindex
a hint. For instance, in this snippet,l.index(999_999, 999_990, 1_000_000)
is roughly five orders of magnitude faster than straightl.index(999_999)
, because the former only has to search 10 entries, while the latter searches a million:>>> 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
Only returns the index of the first match to its argument
A call to
index
searches through the list in order until it finds a match, and stops there. If you expect to need indices of more matches, you should use a list comprehension, or generator expression.>>> [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
Most places where I once would have used
index
, I now use a list comprehension or generator expression because they're more generalizable. So if you're considering reaching forindex
, take a look at these excellent Python features.Throws if element not present in list
A call to
index
results in aValueError
if the item's not present.>>> [1, 1].index(2) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 2 is not in list
If the item might not be present in the list, you should either
- Check for it first with
item in my_list
(clean, readable approach), or- Wrap the
index
call in atry/except
block which catchesValueError
(probably faster, at least when the list to search is long, and the item is usually present.)
这篇关于在列表中查找项目的索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!