c++函数如何返回一个vector_小问题:如何返回一个 List 中某元素的索引?

(给Python开发者加星标,提升Python技能)

综合整理: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 timeittimeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))',number=1000)15.676082027timeit.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)0next(g)2

最后,如果要匹配的元素没有在list种,则调用index会导致ValueError

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

因此如果要找的元素可能不在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类的所有方法及说明,当然也包括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....

- EOF -

推荐阅读   点击标题可跳转

1、问答:两种判断列表为空的方法,你在用哪种?

2、迭代列表不要For循环,这是Python列表推导式最基本的概念

3、深入 Python 列表的内部实现

觉得本文对你有帮助?请分享给更多人

关注「Python开发者」加星标,提升Python技能

2e815f830a6fe8a1569573c20298a637.png

点赞和在看就是最大的支持❤️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值