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)