Simplest way of checking for string that contains a string in list?
我发现自己反复地写着同一段代码:
1 2 3 4 5 6
| def stringInList(str, list):
retVal = False
for item in list:
if str in item:
retVal = True
return retVal |
有没有什么方法可以用更少的代码更快地编写这个函数?我通常在if语句中使用这个,比如:
1 2
| if stringInList(str, list):
print 'string was found!' |
- +1不仅仅是说"有没有一个简单的方法……"并实际展示你所拥有的。做得好
- 在这个函数中不需要局部变量retVal,只需要找到return True,否则需要False。跳过一些不必要的循环。(是的,只需使用any)
- 只是好奇,你为什么一次又一次的需要这个?我想不出一个用例。
- 注意,在Python中,可以避免使用这种"标志变量"。用break代替赋值,然后用for循环的else子句返回False。在某些情况下,这种模式可以提高代码的可读性,并避免过多的缩进级别。
是的,使用any():
1 2
| if any(s in item for item in L):
print 'string was found!' |
正如文档所提到的,这相当于您的函数,但是any()可以采用生成器表达式,而不仅仅是字符串和列表,并且any()短路。一旦s in item为真,函数就会中断(如果您只是将retVal = True改为return True的话,您只需使用函数就可以了。记住,函数返回值时会中断。
应避免命名字符串str,并列出list。这将覆盖内置类型。
- 回答不错,是的。
- +1对于简单明了但仍然非常有用的答案。
- any的效率优势相当于@roippi评论中给出的效率优势:它只在真元素的第一个实例上返回true,如果没有遇到真元素就返回false(请查看等效的code docs.python.org/2/library/functions.html any)
- @海德罗-太好了!多谢。我需要清楚地阅读生成器表达式。
- @弗雷德里克没问题:)
- 您还应该避免命名像L这样大写的变量,因为这与pep8)不符。
- @Neilg引用了PEP8的话,他说When tempted to use 'l', use 'L' instead.链接
- 这是很不幸的,因为它还说实例变量应该是"小写的,并且根据需要用下划线分隔单词以提高可读性"。