小问题:如何返回一个 List 中某元素的索引?
文章插图
综合整理:Python开发者
问题:假设有一个列表["年薪10万", "年薪30万", "年薪50万","年薪100万"] , 我想得到元素"年薪100万"的索引(即3) , 要怎么做?
可能最先想到的是对列表进行遍历 , 对吧?其实有个很简单的方式 , 就是使用List的index函数!
简洁的解决方法:
["年薪10万", "年薪30万", "年薪50万","年薪100万"].index("年薪100万")
3
虽然使用index这个函数是解决问题最简洁的方法 , 但是index函数 , 它在list的API里面是相当“弱“的 , 使用的时候会碰到各种问题 。 所以虽然解决了问题 , 但是我们还是要进一步的展开和总结一下index函数 。
首先 , 看一下index函数的完整形式 list.index(x[, start[, end]]) , 它的功能是返回列表中从第0号数据项开始 , 第一个等于x的数据项的索引 , 如果没有找到x , 则返回ValueError 。
可选参数start和end用来指定搜索列表的特定范围内的序列 , 这时返回的值是相对整个list的起点 , 而非相对于start参数 。
其次 , 每次调用index函数 , 都会顺序检查list中的每个元素 , 直到找到匹配或者返回ValueError 。
但是如果你的list很长 , 并且不知道要找的元素的大概位置 , 那么这个搜索过程就会成为程序运行时间的瓶颈 。 这个时候 , 你可能需要考虑换种数据结构 。
但是如果你知道匹配结果大概位置 , 你可以给index一点“提示“ 。 例如下面这两个例子 , l.index(999_999,999_990,1_000_000)的执行速度是l.index(999_999)的1万倍!!因为前一个index完成匹配只搜索了10次 , 而后一个index函数搜索了近1百万次!!
#电脑不同运行的时长不一样 , 但是时间相差的量级是差不多的
import timeit
timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))',
number=1000)
15.676082027
timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l =
list(range(0, 1_000_000))', number=1000)
0.00032909400000846745
第三、index函数只返回其第一次匹配的索引 。 调用index的时候 , 会搜索整个list直到找到一个匹配的值 , 并停止运行 。 那么如果想要返回多个匹配的话 , 可以使用列表推导式或生成器表达式 。
[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
最后 , 如果要匹配的元素没有在list种 , 则调用index会导致ValueError
[1, 1].index(2)
Traceback (most recent call last):
File "", line 1, in
因此如果要找的元素可能不在list中 , 应该使用try/except捕捉ValueError异常 。
def find_element_in_list(element, list_element):
try:
index_element = list_element.index(element)
return index_element
except ValueError:
return 'not exists'
Tips:最后的最后 , 附送一个学习Python非常有用的tip:使用help函数!
help(["年薪10万", "年薪30万", "年薪50万","年薪100万"])
【小问题:如何返回一个 List 中某元素的索引?】得到关于list类的所有方法及说明 , 当然也包括index函数
class list(object)
...
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value.
| Raises ValueError if the value is not present.
|
| insert(...)
| L.insert(index, object) -- insert object before index
|
| pop(...)
| L.pop([index]) -> item -- remove and return item at index (default last).
| Raises IndexError if list is empty or index is out of range.
...
福利
入门Python的最强三件套《ThinkPython》、《简明Python教程》、《Python进阶》的PDF电子版已打包提供给大家 , 「P3」即可获取 。
- 对手|一加9Pro全面曝光,或是小米11最大对手
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 程序|2020全景生态流量秋季大报告:TOP100APP超半数布局小程序,全景流量重塑行业竞争新格局
- 占营收|华为值多少钱
- 俄罗斯手机市场|被三星、小米击败,华为手机在俄罗斯排名跌至第三!
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 查询|数据太多容易搞混?掌握这几个Excel小技巧,办公思路更清晰
- 培育|跨境电商人才如何培育,长沙有“谱”了
- 不负众望|12小时卖了30万部!Redmi Note9不负众望,卢伟冰开心了?
- 时尚先生|小米雷军成2020年最出圈企业家:获时尚双刊年度人物