Skip to main content
 首页 » 编程设计

python之想改进这个脚本

2025年05月04日20webabcd

我正在审查我保存的一些脚本并遇到了这个特定的脚本;我觉得不需要使用所有小写/大写字母就可以改进它,有什么建议吗?我在考虑使用 str.lower,但不知道如何实现它

def all_but_not_numbs(s: str) -> int: 
    """ 
    >>> all_but_not_numbs('asd123') 
    3 
    >>> all_but_not_numbs('E.666') 
    2 
    """ 
 
    num_letters = 0 
 
    for char in s:  
        if char in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.,': 
            num_letters = num_letters + 1 
    return num_letters 

请您参考如下方法:

使用 str.lower,您可以将要测试的字符小写,这样就不需要大写字母了。 . 或 , 的字符不受 lower 的影响。此外,将 sum 与生成器表达式一起使用可使您的代码更紧凑且(恕我直言)更具可读性。

>>> letters = "abcdefghijklmnopqrstuvwxyz,." 
>>> s = 'E.666' 
>>> sum(1 for c in s if c.lower() in letters) 
2 

或者您可以使用 ascii_letters在 string 模块中定义:

>>> import string 
>>> letters = string.ascii_letters + ",." 
>>> sum(1 for c in s if c in letters) 
2 

不过,在这两种情况下,in 检查都是线性的(O(k) 对于 k 个“好”字母)。对于这么短的字母列表,这应该不是问题,但要进一步改进它,您可以将 letters 转换为 set 以便 in 检查将是 O(1)。

>>> letters = set(letters)