list.index(x)如果该项不存在,Python会引发异常。有没有更好的方式来执行此操作而无需处理异常?
i == -1采取了某些措施。
in关键字。但是,如果您这样做,我认为雷蒙德(Raymond)有一个好处,而例外是解决此问题的最佳方法。
list.index(x)如果该项不存在,Python会引发异常。有没有更好的方式来执行此操作而无需处理异常?
i == -1采取了某些措施。
in关键字。但是,如果您这样做,我认为雷蒙德(Raymond)有一个好处,而例外是解决此问题的最佳方法。
Answers:
index()吗?毕竟,您必须看两次:一次是为了存在,一次是为了索引。这就是为什么C ++的容器没有exists(),只find()。
i = next((i for i, t in enumerate(somelist) if x == t), 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
type(l) == list在False这里。
TL; DR:例外是您的朋友,并且是所述问题的最佳解决方案。
寻求宽恕比获得许可(EAFP)更容易
OP在评论中澄清说,对于他们的用例,知道什么是索引实际上并不重要。如公认的答案所述,x in somelist如果您不在乎,使用是最佳答案。
但是,正如原始问题所暗示的那样,我将假设您确实在乎索引是什么。在这种情况下,我会注意到,所有其他解决方案都需要对列表进行两次扫描,这会带来较大的性能损失。
此外,正如尊敬的Raymond Hettinger在评论中写道
即使我们的list.find返回-1,您仍然需要测试以查看i == -1并采取一些措施。
因此,我将推回原始问题中应该避免例外的假设。我建议例外是你的朋友。没什么可担心的,它们并不是低效的,实际上,您需要精通它们才能编写好的代码。
所以我认为最好的答案是简单地使用try-except方法:
try:
i = somelist.index(x)
except ValueError:
# deal with it
“处理”只是意味着您需要做的事情:将i设置为哨兵值,引发您自己的异常,遵循其他代码分支等。
这是一个为什么Python原理比请求更容易获得宽恕(EAFP)有意义的例子,这与“先飞后看(LBYL)”的if-then-else风格形成对比
编写一个满足您需要的函数:
def find_in_iterable(x, iterable):
for i, item in enumerate(iterable):
if item == x:
return i
return None
如果您只需要知道项目是否存在而不是索引,则可以使用 in:
x in yourlist
'abc'.find('x') == -1,但None也可以使用。我将更新我的答案。
如果您不在乎序列中的位置,只需关心它的存在,然后使用in运算符。否则,编写一个重构异常处理的函数。
def inlist(needle, haystack):
try:
return haystack.index(needle)
except ...:
return -1
in并最终返回索引,但是我看到您知道该方法,因此决定使用可能引发的处理异常。我的问题是:为什么您选择捕获异常而不是首先检查haystack是否存在needle?有什么理由吗?
...的except ...:线。
没有内置的方法可以做您想做的事。
这是一篇很好的文章,可能对您有所帮助:为什么列表没有像字典一样安全的“获取”方法?
IndexError: list index out of range问题,而不是这里描述的问题index()方法ValueError: <value> is not in list。
我喜欢使用Web2py的 List类,该类位于其gluon软件包的存储模块中。存储模块提供类似列表(List)和类似字典(Storage)的数据结构,当找不到元素时,它们不会引发错误。
首先下载web2py的source,然后将gluon package文件夹复制粘贴到python安装的site-packages中。
现在尝试一下:
>>> 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
def __call__(self, idx, df=None): return self[idx] if 0<=idx<len(self) else df