从元组中获取以下索引:2 try / except或1 if / elif

时间:2015-07-22 18:01:22

标签: python

如果你在检查多件事情时,我们找不到有关尝试的信息。我有一个字符串元组,我想获取一个索引并存储其后面的索引。有2例。

mylist = ('a', 'b')

mylist = ('y', 'z')

我想查看ay,具体取决于哪个存在,并获取后面的索引。目前,我正在这样做:

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在这里更好/更有效率?或者是否有更好的方式来完全写出我不知道的内容?

3 个答案:

答案 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的第二个代码片段更简洁干净。