我需要在Python中引发ValueError吗?

5

我有这段代码:

chars = #some list

try:
    indx = chars.index(chars)
except ValueError:
    #doSomething
else:
   #doSomethingElse

我希望能够做到这一点,因为我不喜欢故意引发异常:

chars = #some list

indx = chars.index(chars)

if indx == -1:
    #doSomething
else:
   #doSomethingElse

有没有方法可以做到这一点?

注意:您正在为要搜索的列表和要查找的项使用相同的变量名称(chars)。除非您正在搜索自我引用列表以查找它们引用自身的位置,否则其中一个变量名称应该不同。 - Brian
如果你想要高效的代码,最好学会享受异常而不是担心“故意引发异常”。异常以及它们的引发是 Python 的重要组成部分。 - Thomas Wouters
3个回答

9

哪种方法更快?还是这个问题不相关?我应该使用C语言吗?;) - jjnguy
@jinguy:不用担心速度。只需编写易于阅读的代码。如果需要更好的性能,请通过配置文件运行它--很有可能慢的部分不是异常处理。 - John Millikin
@jinguy,通常情况下,EAFP在非错误案例中表现出更优秀的性能,这种情况比错误案例更常见(在大多数情况下 :))。具体情况因人而异。 - Kevin Little

7
if element in mylist:
    index = mylist.index(element)
    # ... do something
else:
    # ... do something else

当然,这将对列表进行两次搜索,并且对于较长的列表,速度会渐进性地慢两倍...但我不知道更好的解决方案。 - Thomas

0

对于特定情况,如果您的列表是一系列单字符串,您可以通过预先将要搜索的列表更改为字符串(例如 ''.join(chars))来获得所需的结果。

然后,您可以使用 .find() 方法,该方法会按照您所需的方式工作。但是,对于列表或元组,没有相应的方法。

另一个可能的选择是使用字典代替。例如:

d = dict((x, loc) for (loc,x) in enumerate(chars))
...
index = d.get(chars_to_find, -1)  # Second argument is default if not found.

如果你在列表上进行了大量的搜索,这也可能表现得更好。但如果只是在一个一次性使用的列表上进行单个搜索,那么这就不值得做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接