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

2024-03-29 09:48:53 发布

您现在位置: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在这里更好/更有效,对吗?或者有没有更好的方式来写这个我完全不知道?你知道吗


Tags: 项目字符串innoneindexif详细信息pass
3条回答

我的观点和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循环除外,这是必须的)。你知道吗

编辑:事实上,经过一段时间的测量,罗希斯·苏布拉曼尼亚姆的版本乍一看似乎要快一点。(每个环路640纳秒,而每个环路740纳秒)

就性能而言,Python中的异常不像其他语言中的异常那么严重,您不必担心在适当的时候使用它们。你知道吗

也就是说,第二个代码片段更加简洁和干净。你知道吗

您的第一个代码段应该如下所示:

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

IMO使用try块在性能方面更好,因为无论ValueError发生与否,您都可以避免在任何情况下进行检查,而且它的可读性和python性也更高。你知道吗

相关问题 更多 >