Python 希望改进此脚本
我正在回顾我保存的一些脚本,并且在这个特定的脚本中遇到了这些脚本;我觉得不需要使用所有小写/大写字母就可以改进,有什么建议吗?我想使用Python 希望改进此脚本,python,Python,我正在回顾我保存的一些脚本,并且在这个特定的脚本中遇到了这些脚本;我觉得不需要使用所有小写/大写字母就可以改进,有什么建议吗?我想使用str.lower,但不知道如何实现它 def all_but_not_numbs(s: str) -> int: """ >>> all_but_not_numbs('asd123') 3 >>> all_but_not_numbs('E.666') 2 """
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
使用
regex
查找所有字母和点并计算长度:
import re
s = 'asd123'
print(len(re.findall(r'[a-zA-Z\.]', s)))
# 3
使用
regex
查找所有字母和点并计算长度:
import re
s = 'asd123'
print(len(re.findall(r'[a-zA-Z\.]', s)))
# 3
使用
str.lower
,您可以将要测试的字符小写,因此不需要大写字母。
或,
的字符不受下限的影响。另外,将sum
与生成器表达式一起使用,可以使代码更紧凑,并且(IMHO)更可读
>>> letters = "abcdefghijklmnopqrstuvwxyz,."
>>> s = 'E.666'
>>> sum(1 for c in s if c.lower() in letters)
2
或者您可以使用字符串模块中定义的:
>>> import string
>>> letters = string.ascii_letters + ",."
>>> sum(1 for c in s if c in letters)
2
>>> s
'asd123'
>>> len(s.strip(string.digits))
3
在这两种情况下,
中的检查都是线性的(O(k)表示k个“好”字母)。对于如此短的字母列表,这应该不是问题,但为了进一步改进,您可以将字母
转换为集合
,以便
中的检查为O(1)
使用str.lower
,您可以将要测试的字符小写,因此不需要大写字母。
或,
的字符不受下限的影响。另外,将sum
与生成器表达式一起使用,可以使代码更紧凑,并且(IMHO)更可读
>>> letters = "abcdefghijklmnopqrstuvwxyz,."
>>> s = 'E.666'
>>> sum(1 for c in s if c.lower() in letters)
2
或者您可以使用字符串模块中定义的:
>>> import string
>>> letters = string.ascii_letters + ",."
>>> sum(1 for c in s if c in letters)
2
>>> s
'asd123'
>>> len(s.strip(string.digits))
3
在这两种情况下,
中的检查都是线性的(O(k)表示k个“好”字母)。对于如此短的字母列表,这应该不是问题,但为了进一步改进,您可以将字母
转换为集合
,以便
中的检查为O(1)
您也可以使用以下方法,基本上是剥离数字并使用len
来计算剩余字符数:
>>> s
'asd123'
>>> to_strip = '0123456789'
>>> len(s.strip(to_strip))
3
或者使用string
模块中的string.digits
:
>>> import string
>>> letters = string.ascii_letters + ",."
>>> sum(1 for c in s if c in letters)
2
>>> s
'asd123'
>>> len(s.strip(string.digits))
3
编辑:根据tobias_k的评论,我建议以下内容与Austing的答案相似,但方法不同:
>>> s = 'abced@#$%123'
>>>
>>> import re
>>>
>>> to_strip
'0123456789'
>>> re.findall('[^{}]'.format(to_strip), s)
['a', 'b', 'c', 'e', 'd', '@', '#', '$', '%']
>>> len(re.findall('[^{}]'.format(to_strip), s))
9
它表示查找除(^)后面提到的字符(即数字)以外的所有字符。您也可以使用以下方法,基本上,剥离数字并使用len
计算剩余字符数:
>>> s
'asd123'
>>> to_strip = '0123456789'
>>> len(s.strip(to_strip))
3
或者使用string
模块中的string.digits
:
>>> import string
>>> letters = string.ascii_letters + ",."
>>> sum(1 for c in s if c in letters)
2
>>> s
'asd123'
>>> len(s.strip(string.digits))
3
编辑:根据tobias_k的评论,我建议以下内容与Austing的答案相似,但方法不同:
>>> s = 'abced@#$%123'
>>>
>>> import re
>>>
>>> to_strip
'0123456789'
>>> re.findall('[^{}]'.format(to_strip), s)
['a', 'b', 'c', 'e', 'd', '@', '#', '$', '%']
>>> len(re.findall('[^{}]'.format(to_strip), s))
9
它说要查找除(^)后面提到的字符以外的所有字符,这些字符是数字。我使用了s.isalpha()
,s.upper.isupper()
,和ch-in.
(不需要,
):
现在,我的问题是为什么Python会说我的行如果ch.isalpha():
不一致?
错误:builtins.TabError:缩进中制表符和空格的使用不一致
num = 0
for ch in s:
if ch.isalpha():
num = num + 1
elif ch.upper.isupper():
num = num + 1
elif ch in '.':
num = num + 1
return num
我使用了s.isalpha()
,s.upper.isupper()
,和ch-in.。
(不需要,
):
现在,我的问题是为什么Python会说我的行如果ch.isalpha():
不一致?
错误:builtins.TabError:缩进中制表符和空格的使用不一致
num = 0
for ch in s:
if ch.isalpha():
num = num + 1
elif ch.upper.isupper():
num = num + 1
elif ch in '.':
num = num + 1
return num
这是一个非常有用的模块这是一个非常有用的模块,它不适用于其他字符,如$、%、-、*、(,等等),如果您扩展要删除的字符列表,您只是在解决OP的问题(更糟的是,要写出的字符列表更长)此外,<代码>条带<代码>不会删除字符串中间的字符。@ toBiasyk,回答更新,谢谢你的头部。不适用于其他字符,如$,%,-*,(等),如果你扩展的字符列表要删除,你只是逆OP的问题。(更糟的是,有一个较长的字符列表要写出)。此外,<代码>条目< /代码>不会删除字符串中间的字符。@ toBiasik,回答更新,谢谢!