有没有办法可以使用地图或列表理解或任何其他更快的方式实现下面的代码块,保持其功能相同?
def name_check(names, n_val):
lower_names = names.lower()
for item in set(n_val):
if item in lower_names:
return True
return False
感谢任何帮助
答案 0 :(得分:1)
一个简单的实现是
return any(character in names_lower for character in n_val)
对复杂性的一种天真猜测是O(K*2*N)
其中K
是names
中的字符数,N
是n_val
中的字符数。我们需要一个“循环”来调用lower *,一个用于内部理解,一个用于any
。由于any
是内置函数,我们正在使用生成器表达式I would expect it to be faster than your manual loop,但与往常一样,配置文件是确定的。
要明确any
short-circuits,以便保留行为
有关您的实施的说明
关于使用set
:您的直觉使用集合来减少支票数量是一个很好的(你也可以将它添加到上面的表格中),但它是权衡。在第一个元素短路的情况下,对set的额外调用是生成集合表达式的额外N
步骤。如果您最终检查每个项目,它将节省您一些时间。这取决于您的预期投入。如果n_val
最初是可迭代的,那么您已经失去了这个好处并且预先分配了所有内存。如果您控制函数的输入,为什么不建议使用没有重复的列表调用它(即在其输入上调用set()
),并保留函数的一般性?
*
@Neopolitan指出应该在循环中调用names_lower = names.lower()
,因为你的原始实现调用它,否则它可能(会?)在生成器表达式中重复调用