繁体   English   中英

如何让python程序检查字符串中是否有字母

[英]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)

关键点:

  • 通过将字母存储在一个集合而不是一个不允许快速(O(1))元素检查的更一般的可迭代中来避免线性搜索
  • 循环输入,而不是目标字母,因为字母表可能是一个有限的常量大小集合,并且允许甚至非常大的输入,没有线性搜索和过多的内存使用(将输入放入集合而不是字母表中)
  • 通过使用生成器表达式避免不必要的列表创建(和浪费的内存)

这里有一些劣等的选择。

通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM