Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从元组中获取以下索引:2 try/except或1 if/elif_Python - Fatal编程技术网

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

Python 从元组中获取以下索引:2 try/except或1 if/elif,python,Python,在检查多个项目时,找不到有关“尝试”与“如果”的详细信息。我有一个字符串元组,我想获取一个索引并存储它后面的索引。有2例 mylist = ('a', 'b') 或 我想查看a或y,具体取决于哪个存在,并获取下面的索引。目前,我正在这样做: item['index'] = None try: item['index'] = mylist[mylist.index('a') + 1] except ValueError: pass try: item['index'] =

在检查多个项目时,找不到有关“尝试”与“如果”的详细信息。我有一个字符串元组,我想获取一个索引并存储它后面的索引。有2例

mylist = ('a', 'b')

我想查看
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
阅读后,我认为这样写可能会更好/更有效,因为有一半的时间,它可能会引发异常(
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

如果
在这里更好/更有效,我的假设是对的吗?还是有一种我完全不知道的更好的编写方法?

在性能方面,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风格。

我的观点与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纳秒)

这是网络爬虫/刮板的一部分。所以我会假设,一旦我有了更复杂的代码,或者仅仅是更多的代码,只要我能节省半秒钟左右的时间,就会非常有益。根据我链接的问题,使用以异常结束的
try
if
@JeremyDavis
try
上花费了半秒时间,而不是
if
上的“半秒”,而是
if
上运行一百万个代码周期的半秒时间。查看doc,查看
number
参数-正如您所看到的,它默认值为一百万。在我看来,
for
循环显然更干净,+1。因此,即使有一半的时间会出现
ValueError
,但您认为使用
try
而不是
if
更快吗?我个人总是使用try except。但如果你真的认为这不是一个例外,而是一种规范。也许您只想从命令行编写版本和计时,比如$time python your_script.py。用这种方法检查比在程序中使用timeit要容易得多。你的答案对我来说似乎更清晰,我相信我最初的假设是如果
更快,那么使用
。(顺便说一句,你最后一行的
元素
应该是
接受的元素
:P)我在我的问题中链接了这个问题。我的主要问题是询问多次尝试是否知道它们会引发异常,或者使用ifs,以及规则是否仍然适用。如果是这样,
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