list的index()函数

list的index()似乎不值一提,就是搜索某个值出现的位置嘛,但实际开发中,又不得不讨论一下。

注意点

当搜索不到时,index()是抛出异常,而不是像其他语言一下返回-1. 

它的另外两个参数L.index(value, [start, [stop]]),start和stop是指定搜索切片位置,但是返回的位置值,还是从list开头算起。

实际问题

实际开发时,并不是搜索相等元素那么简单,你可能会发现,index()并不支持一个比较函数,也不像sort()那样支持一个key函数。这时候会感觉javascript里的indexOf()更强大。

当然这有很多种办法解决,最次的就是老老实实写个for循环。

次之的办法是生成一个key的list,然后再来index:


s = [{'age': 20, 'name': '张三'}, {'age': 23, 'name': '李四'}, {'age': 25, 'name': '王五'}]
[i['age'] for i in s].index(25) ==> 2

优一点的办法是:


[i for i,e in enumerate(s) if e['age'] == 25][0] ==> 2

当然这里实际是把s遍历了一遍,实际我们只需要搜索到第一个,如果年龄为25的有多个,就会有点费了。

最优的办法是:


g = (i for i,e in enumerate(s) if e['age'] == 25)
next(g) ==> 2

注意这里的g是一个迭代器,换成方括号就成list了。两句写一块就是:


next(i for i,e in enumerate(s) if e['age'] == 25)

就算有多个年龄25的,也只会返回第一个的索引。如此简单高效,还要什么indexOf().

如果不确定列表里有没有,又不想try except捕获异常,就加个默认值,这么写:


next((i for i in params if i['type'] == 'weekdays'), None)
发表于 2020年04月05日 10:49   修改于 2020年04月17日 16:40   评论:0   阅读:2413  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo