更快地使用循环生成python代码块

更快地使用循环生成python代码块,python,for-loop,list-comprehension,Python,For Loop,List Comprehension,有没有一种方法可以使用map或list comprehension或任何其他更快的方法实现下面的代码块,使其功能保持不变 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 非常感谢您的帮助一个简单的实现就是 return

有没有一种方法可以使用map或list comprehension或任何其他更快的方法实现下面的代码块,使其功能保持不变

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

非常感谢您的帮助

一个简单的实现就是

return any(character in names_lower for character in n_val)
对复杂性的天真猜测是
O(K*2*N)
,其中
K
names
中的字符数,
N
N\val
中的字符数。我们需要一个“循环”来调用lower*,一个用于内部理解,另一个用于
any
。因为
any
是一个内置函数,我们使用的是一个生成器表达式,但与往常一样,要确定的是profile

要清楚,这样才能保持行为


实施说明

关于使用
集合
你使用集合来减少支票数量的直觉是很好的(你也可以将其添加到我上面的表单中),但这是一种权衡。在第一个元素短路的情况下,对set的额外调用是额外的
N
步骤,以生成set表达式。如果你最后检查了每一项,这将为你节省一些时间。这取决于你的预期投入。如果
n_val
最初是一个iterable,那么您就失去了这一优势,并提前分配了所有内存。如果您控制函数的输入,为什么不建议使用没有重复项的列表调用它(即,在其输入上调用
set()
),并将函数保留为常规



*
@Neopolitan指出,
names\u lower=names.lower()
应该在循环外调用,正如您最初的实现所称,否则它可能(将?)在生成器表达式中重复调用

什么数据结构是name和n\u val?names是str,n\u val是list,我不确定,但是如果这个代码有效的话,这个问题可能更适合codereview。有人知道吗?@en_Knight是对的,尽管它缺少一些上下文和对它所做事情的描述,而且对于CR问题来说,它的标题有点糟糕(很多问题可能都有完全相同的标题)。有关所有信息,请参阅。@en\u Knight您下面的答案对CR非常有用-您的CR帐户在哪里?=)不想调用生成器表达式中的names.lower();我不认为解释器可以保证names.lower()每次都返回相同的内容(对于任意对象名,它当然不会),因此,将
lower\u names=names.lower()
分配到OP拥有的循环之外。它也会更快。