1

我正在尝试使用 ord 函数拆分字符串。这是我的代码

def sortString(info):
    res = isinstance(info, str)
    if res:
        for char in info:
            charValue = ord(char)

            #Lowercase
            if charValue > 96 and charValue < 123:
                lChar += char

            #Uppercase   
            elif charValue > 64 and charValue < 91:
                cChar += char

            #Punctuation
            elif charValue > 32 and charValue < 65:
                pChar += char

            #Spaces
            elif charValue == 32:
                numSpace += 1

        result = "cChar\nlChar\npChar\nnumSpace"

        return result
    else:
        return "Not a string!"

我希望它根据大写、小写、标点符号和空格数来拆分字符串。所以“你好,世界!!” 会输出:

HW  
elloorld   
,!!  
1

我现在得到的错误是 UnboundLocalError: local variable 'cChar' referenced before assignment。我试图制作一个空字符串,但这并没有解决问题。

4

3 回答 3

3

cChar您在初始化之前正在更新,lChar并且pChar

def sortString(info):
    res = isinstance(info, str)
    if res:
        # INITIALISING
        cChar = lChar = pChar = "" #initialisation error fixed
        numSpace = 0 #initialisation error fixed
        for char in info:
            charValue = ord(char)

            #Lowercase
            if charValue > 96 and charValue < 123:
                lChar += char #initialisation error

            #Uppercase   
            elif charValue > 64 and charValue < 91:
                cChar += char #initialisation error

            #Punctuation
            elif charValue > 32 and charValue < 65:
                pChar += char #initialisation error

            #Spaces
            elif charValue == 32:
                numSpace += 1 #initialisation error

        result = cChar+ '\n' + lChar + '\n' +pChar + '\n' +str(numSpace) # indentation error and value error
        # you can also use this 
        # result = f"{cChar}\n{lChar}\n{pChar}\n{numSpace}" 
        return result #indentation error
    else:
        return "Not a string!"

print(sortString("HelloWhatsup"))

请更新您的代码,它有错误

于 2020-04-24T18:00:27.143 回答
1

制作cChar一个空字符串可以解决问题。但是,lCharpChar, 和numSpace也需要定义。

然后还有另外两个问题:result =andreturn行缩进太远,并且你result没有使用变量。

所以要修复它:

cChar = lChar = pChar = ''
numSpace = 0
for char in info:
    # ...
result = '\n'.join([cChar, lChar, pChar, str(numSpace)])
return result

顺便说一句,有很多事情可以改进。开始:

使用保护子句代替嵌套条件,并使用异常来表示错误

if not isinstance(info, str):
    raise TypeError("Not a string!")

使用 Python 的区间测试语法

if 96 < charValue < 123:  # Lowercase
    lChar += char
于 2020-04-24T19:23:32.023 回答
0

因为正则表达式很慢(?)

如果使用和范围测试背后的基本原理ord()是试图避免正则表达式的缓慢,那么你会失望的。

让我们将正则表达式解决方案与sortString()使用ord()范围测试的方法进行比较,以对字符进行分组。

正则表达式方法

正则表达式用于匹配多组字符范围,并将zip()匹配项聚合到组列表中。

>>> import re
>>> expr = re.compile(r"""([A-Z]+)  |         # Capitals.
...                       ([a-z]+)  |         # Lowercase.
...                       (\s+)     |         # Whitespace.
...                       ([!-/:-@\[-`{-~]+)  # Punctuation and symbols.
...                       """, 
...                       re.VERBOSE)
...
>>> [''.join(m) for m in zip(*expr.findall("The quick, and brown, fox"
...                                        " jumped (not leaped) over"
...                                        " the LAZY!!! dog =(."))]
['TLAZY', 
 'hequickandbrownfoxjumpednotleapedoverthedog', 
 '            ', 
 ',,()!!!=(.']

根据其他答案中的工作实现来计时sortString(),我得到几乎完全相同的时间来完成 10**6 次迭代。

>>> timeit.timeit("group_chars_regex(s)", globals=globals(), number=10**6)
16.637040594941936

在超过 10 年历史的 Mac 主机上的 Linux VM 上运行。

字典方法

字典查找速度很快,让我们为执行分组的基于字典的解决方案计时。

>>> groups = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ",
...           "abcdefghijklmnopqrstuvwxyz",
...           " \t\r\n",
...           "!@#$%^&*()_+=-`~,..;:/?'\"[]{}\|")
>>> group_dict = {ch: n for n in range(4) for ch in groups[n]}
>>> 
>>> def group_chars(s):
...     lis = ['', '', '', '']
...     for ch in s:
...         lis[group_dict[ch]] += ch
...     return lis

group_dict将每个字符映射到它所属的组的索引。该索引用于更新列表中的字符串。

对它进行计时,sortString()我们可以看到时间缩短了大约 4 秒。

>>> timeit.timeit("group_chars(s)", globals=globals(), number=10**6)
12.557713539921679
>>>
>>> # The ord() and range testing method:
>>> timeit.timeit("sortString(s)", globals=globals(), number=10**6)
16.32978364895098
>>> 

dict方法是三种分组方法中最快的。

于 2020-04-25T05:58:33.057 回答