[英]how do i make a python program check if a there is a letter from a string in a string
我试图让python程序检查字符串中是否至少有一个字母?
import string
s = ('hello')
if string.ascii_lowercase in s:
print('yes')
else:
print('no')
它总是只打印否
好吧, string.ascii_lowercase
等于'abcdefghijklmnopqrstuvwxyz'
。 这看起来不像是hello
,对吗?
你应该做的是ascii_lowercase
的字母并检查它们中是否有任何字符串。
import string
s = ('hello')
if any([letter in s for letter in string.ascii_lowercase]):
print('yes')
else:
print('no')
评论中非常聪明的人指出,您可以删除通常会创建列表的[ ]
括号,将列表理解转换为称为生成器的东西。 这样可以防止需要检查ascii_lowercase
每个字母,并使我们的代码更快一些 - 就目前而言,生成整个列表然后进行检查。 使用生成器,字母只会检查到e
,就像'hello'
。
我能用这种方式剃掉整整一纳秒 ! 尽管如此,对于大多数情况来说,直接浏览整个列表应该没问题,并且肯定更简单。
检查的一种有效方法,如果一些字符串s
包含一些字母的任何字符:
alphabet = frozenset(string.ascii_lowercase)
any(letter in alphabet for letter in s)
关键点:
这里有一些劣等的选择。
通过string.ascii_lowercase
线性搜索:
any(letter in string.ascii_lowercase for letter in s)
线性搜索string.ascii_lowercase
,以及无用的列表创建:
any([letter in string.ascii_lowercase for letter in s])
对输入进行线性搜索,在输入非常长并且不包含字母表中的任何字符的最坏情况下性能非常差:
any(letter in s for letter in string.ascii_lowercase)
目前您正在检查整个字符串string.ascii_lowercase
是否在s
。
您必须检查string.ascii_lowercase
每个字符。
天真的解决方案看起来像这样:
>>> s = 'hello'
>>> for letter in string.ascii_lowercase:
... if letter in s:
... print('yes')
... break
... else:
... print('no')
...
yes
这里,只有在循环没有被break
语句打破时, else
块才会执行。
for
循环的简写是使用与generator-expression配对的any
内置函数:
>>> contained = any(letter in s for letter in string.ascii_lowercase)
>>> print('yes' if contained else 'no')
yes
最后,可以通过使用改进两种实现的运行时set
从字符的s
,即s = set(s)
。 这将确保每一个in
检查中固定的时间,而不是遍历执行s
为每个被搜索的信。
编辑:这是另一个简短的:
>>> if set(s).intersection(string.ascii_lowercase):
... print('yes')
... else:
... print('no')
...
yes
这使用了以下事实:在if
检查中,空集(交集的可能结果)将被视为False
。
(它有一个轻微的缺点,即一旦发现一个共享的字母,交叉点的计算就不会停止。)
制作一set
每个字符串并检查其交集的大小
def share_letter(s1, s2):
return bool(set(s1).intersection(s2))
这是另一种选择:
import string
s = ('hello')
alpha = string.ascii_lowercase
if any(i in alpha for i in s):
print('yes')
else:
print('no')
或者更快:
import string
s = ('hello')
alpha = string.ascii_lowercase
for l in s:
if l in alpha:
print("yes")
break
print("no")
string.ascii_lowercase
是一个包含所有小写字母的字符串,即abcdefghijklmnopqrstuvwxyz
。
因此,在if条件中, if string.ascii_lowercase in s
正在检查字符串是否包含子字符串abcdefghijklmnopqrstuvwxyz
。
你可以试试这个,
if any(e in string.ascii_lowercase for e in s):
...
any
的表达式是生成器,因此它在第一次匹配时停止检查。
另一种方法是,
if any(e.islower() for e in s):
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.