list.index(x)如果该项不存在,Python会抛出异常.有没有更好的方法来做到这一点,不需要处理异常?
Ray*_*ger 78
如果你不关心匹配元素的位置,那么使用:
found = x in somelist
Run Code Online (Sandbox Code Playgroud)
i = somelist.index(x) if x in somelist else None
Run Code Online (Sandbox Code Playgroud)
nea*_*mcb 11
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
Run Code Online (Sandbox Code Playgroud)
“处理它”只是意味着做你需要做的事情:将 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
Run Code Online (Sandbox Code Playgroud)
如果您只需要知道该项目是否存在,而不需要知道索引,您可以使用in:
x in yourlist
Run Code Online (Sandbox Code Playgroud)
为列表实现自己的索引?
class mylist(list):
def index_withoutexception(self,i):
try:
return self.index(i)
except:
return -1
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42345 次 |
| 最近记录: |