检查列表中是否存在包含特定字符串的字符串的最简单方法是什么?

52

我发现自己反复编写相同的代码块:

def stringInList(str, list):
    retVal = False
    for item in list:
        if str in item:
            retVal = True
    return retVal

有没有办法可以更快地编写/用更少的代码编写此函数? 我通常在if语句中使用它,像这样:

if stringInList(str, list):
    print 'string was found!'

8
谢谢你的夸奖。你说得很对,不仅问“有没有简单的方法...”而且展示自己已经做了哪些工作是很重要的。做得好! - TerryA
5
在那个函数中你不需要一个叫做retVal的局部变量,当你找到时只需返回True,否则返回False。跳过一些不必要的循环。(是的,只需使用any)。 - roippi
1
只是好奇,为什么你一遍又一遍地需要这个?我想不出一个使用案例。 - Christoffer Hammarström
1
请注意,在Python中,您可以避免使用此类“标志变量”。可以使用break代替赋值,然后在for循环的else子句中使用False返回。在某些情况下,此模式可以提高代码可读性并避免太多缩进级别。 - Bakuriu
1个回答

76

是的,使用any()函数:

if any(s in item for item in L):
    print 'string was found!'

如文档所述,这基本等同于您的函数,但是any()可以接受生成器表达式而不仅仅是字符串和列表,并且any()会进行短路运算。一旦s在item中为True,函数就会停止(如果将retVal = True更改为return True,则可以在您的函数中轻松实现此操作。请记住,当函数返回一个值时,函数就会停止运行)。


应避免将字符串命名为str和列表命名为list。这将覆盖内置类型。


1
+1 对于简单明了但仍然非常有用的答案。 - user2742371
3
any 函数在效率上具有与 @roippi 评论中提到的相同优势:它只返回第一个 true 元素的实例,并且如果在不遇到 true 元素的情况下到达末尾,则返回 false(请查看等效代码 http://docs.python.org/2/library/functions.html#any)。 - Silverfish
@Haidro - 太完美了!非常感谢。我需要好好学习一下生成器表达式。 - fredrik
你还应该避免使用大写字母命名变量,比如 L,因为这违反了 PEP8 规范 :) - Neil G
@NeilG 实际上,引用PEP8的话,它说当想使用'l'时,请改用'L'。- 链接 - TerryA
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接