Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 希望改进此脚本_Python - Fatal编程技术网

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,回答更新,谢谢!