-1

可能是一个愚蠢的问题,但我一般想知道,如果有人知道,Python 解释器有多少远见,特别是在正则表达式和文本解析领域。

假设我的代码在某个时候看起来像这样:

mylist = ['a', 'b', 'c', ... ]

if 'g' in list: print(mylist.index('g'))

有没有更安全的方法可以使用 while 循环或类似方法来做到这一点。我的意思是,是否会从一开始就进行第二次解析来查找索引,还是 Python 认为两个 g(在上面的行中)是同一件事?

4

6 回答 6

4

它会进行两次查找。如果值得(例如,一个非常大的列表),请使用try

try:
    print(mylist.index('g'))
except ValueError:
    pass
于 2012-08-30T02:55:16.463 回答
4

包含检查的结果没有被缓存,因此需要重新发现索引。而 Python 的动态特性使得这种东西的隐式缓存不可靠,因为该__contains__()方法可能会改变对象(尽管这样做会违反一些编程原则)。

于 2012-08-30T02:55:38.710 回答
1

您可以轻松地制作字典进行查找。像这样的东西:

mydict = {k:v for v,k in enumerate(mylist)}

除非您在同一个文件上进行一些这样的查找,否则创建的开销是dict不值得的list

于 2012-08-30T04:22:01.223 回答
1

您的代码将导致两次查找,首先确定“g”是否在列表中,然后查找索引。Python 不会尝试将它们合并到单个查找中。如果您担心效率,您可以使用字典而不是列表,这将使查找 O(1) 而不是 O(n)。

于 2012-08-30T02:55:40.603 回答
0

是的,它将被查找两次,python解释器不缓存指令,尽管我想知道它是否可能(对于某些事情),如果这是一个问题,那么你可以使用setdicts两者都有常量查时间。

无论哪种方式,您似乎都是LBYL,在 python 中,我们倾向于EAFP,因此将这些东西包装在try ... except块中是很常见的

于 2012-08-30T05:32:04.627 回答
0

尝试是在列表中查找元素索引的更好选择。尝试: print(mylist.index('g')) except ValueError: print "value not in list"
pass

于 2012-08-30T04:36:28.640 回答