我正在审查我保存的一些脚本并遇到了这个特定的脚本;我觉得不需要使用所有小写/大写字母就可以改进它,有什么建议吗?我在考虑使用 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)
