用于Python的list.index()函数,当没有find时不会抛出exception

如果该项目不存在,Python的list.index(x)将引发exception。 有没有更好的方法来做到这一点,不需要处理exception?

如果您不关心匹配元素的位置,请使用:

 found = x in somelist 

如果你真的在乎,那么使用带有条件expression式的LBYL样式:

 i = somelist.index(x) if x in somelist else None 

实现你自己的列表索引?

 class mylist(list): def index_withoutexception(self,i): try: return self.index(i) except: return -1 

所以,你可以使用list和index2,在出错的时候返回你想要的。

你可以像这样使用它:

  l = mylist([1,2,3,4,5]) # This is the only difference with a real list l.append(4) # l is a list. l.index_withoutexception(19) # return -1 or what you want 

写一个你需要的function:

 def find_in_iterable(x, iterable): for i, item in enumerate(iterable): if item == x: return i return None 

如果您只需要知道该项目是否存在,而不是索引,则可以用于:

 x in yourlist 

就在这里。 你可以例如。 做类似这样的事情:

 test = lambda l, e: l.index(e) if e in l else None 

其工作原理是这样的:

 >>> a = ['a', 'b', 'c', 'g', 'c'] >>> test(a, 'b') 1 >>> test(a, 'c') 2 >>> test(a, 't') None 

因此,基本上, test() 将返回给定列表(第一个参数) 中的元素 (第二个参数)的索引除非没有find (在这种情况下,它将返回None ,但它可以是任何你认为合适的)。

如果你不关心它在哪里,只有它的存在,然后使用in运算符。 否则,编写一个重构exception处理的函数。

 def inlist(needle, haystack): try: return haystack.index(needle) except ...: return -1 

希望这可以帮助

 lst= ','.join('qwerty').split(',') # create list i='a' #srch string lst.index(i) if i in lst else None 

没有内置的方式来做你想做的事情。

这里有一个好的post可以帮助你: 为什么列表没有像字典那样安全的“get”方法?

我喜欢使用其胶子包的存储模块中的Web2py的 List类。 存储模块提供了类似列表(List)和类似字典(存储)的数据结构,当找不到元素时不会引发错误。

首先下载web2py的源代码 ,然后将gluon包文件夹复制粘贴到python安装的网站包中。

现在试试看:

 >>> from gluon.storage import List >>> L = List(['a','b','c']) >>> print L(2) c >>> print L(3) #No IndexError! None 

请注意,它也可以像常规列表一样运行:

 >>> print L[3] Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> l[3] IndexError: list index out of range