星期六, 2月 28, 2015

python:傳回 list 中符合條件的 index

stackoverflow 有個好問題, 怎麼在 list 用最精簡的方式找出符合條件的 index ?

Finding the index of an item given a list containing it in Python

alist = ["foo", "bar", "baz", "bar"]

**********************************
 list.index() -- list class 之 member function, 但只傳找到第ㄧ各, 
alist.index('bar') 
#1

找不到的話奉上 error, 不見得好啊 
alist.index('haha')
#error ....
要用 try except 處理, 挺麻煩不是嗎


def sublist(e, l):
try:
i = l.index(e)
return i
except ValueError:
return -1

sublist('bar', alist)
#1
sublist('err', alist)
#-1 

自寫
def match(a, alist): return [i for i,v in enumerate(alist) if v == 'bar']
match('bar', alist)
#[1, 3]

更簡化成
a = [ i for i,v in enumerate(alist) if v == 'bar' ]

上述挺簡潔的, 但太依賴 enumerate(), 用更基本的 range 寫呢?
[ i for i in range(len(alist)) if alist[i] == 'bar']
#[1, 3]

用 if .. in 呢? 
其實本題並不要找 list, 這種就夠了    
if 'bar' in alist: alist.index('bar')
#1