如果你在检查多件事情时,我们找不到有关尝试的信息。我有一个字符串元组,我想获取一个索引并存储其后面的索引。有2例。
mylist = ('a', 'b')
或
mylist = ('y', 'z')
我想查看a
或y
,具体取决于哪个存在,并获取后面的索引。目前,我正在这样做:
item['index'] = None
try:
item['index'] = mylist[mylist.index('a') + 1]
except ValueError:
pass
try:
item['index'] = mylist[mylist.index('y') + 1]
except ValueError:
pass
在阅读Using try vs if in python后,我认为以这种方式编写它可能实际上更好/更有效,因为有一半时间,它可能会引发异常,(ValueError
),这是更多如果我正确理解,那么比if / else贵:
if 'a' in mylist:
item['index'] = mylist[mylist.index('a') + 1]
elif 'y' in mylist:
item['index'] = mylist[mylist.index('y') + 1]
else:
item['index'] = None
我是否正确地认为if
在这里更好/更有效率?或者是否有更好的方式来完全写出我不知道的内容?
答案 0 :(得分:1)
您的第一个代码段应该如下所示:
try:
item['index'] = mylist[mylist.index('a') + 1]
except ValueError:
try:
item['index'] = mylist[mylist.index('y') + 1]
except ValueError:
item['index'] = None
或者像这样有一个for循环:
for element in ['a', 'y']:
try:
item['index'] = mylist[mylist.index(element) + 1]
except ValueError:
continue
else:
break
else:
item['index'] = None
使用try块的IMO在性能上更好,因为您可以避免在每种情况下进行if-checking,无论ValueError发生与否的频率如何,并且它也更具可读性和pythonic。
答案 1 :(得分:1)
我的观点与Rohith Subramanyam很接近。我认为for循环肯定更具可读性,特别是在你需要测试两个以上元素的情况下!
但我仍然认为使用if块更合乎逻辑(双关语!)。严格来说,在代码行方面也不那么冗余:
accepted_elements = ['a', 'y']
item['index'] = None
for accepted_element in accepted_elements:
if accepted_element in mylist:
item['index'] = mylist[mylist.index(accepted_element) + 1]
break
我认为你最终使用的解决方案真的取决于你,因为它取决于你的代码习惯(除了for循环这是必须的)。
编辑:实际上,经过一段时间的测量后,看起来Rohith Subramanyam的版本乍看之下略快一些。 (每个环640 ns,每个环740 ns)
答案 2 :(得分:0)
性能方面,Python中的异常并不像其他语言那样沉重,您不必担心在适当的时候使用它们。
那就是说,IMO的第二个代码片段更简洁干净。