使用ord函数对字符串进行排序



我正在尝试使用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 = "cCharnlCharnpCharnnumSpace"
return result
else:
return "Not a string!"

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

HW  
elloorld   
,!!  
1

我现在得到的错误是UnboundLocalError:在赋值之前引用了本地变量"cChar"。我试图制作一个空字符串,但这并没有解决问题。

在初始化cChar之前,您正在更新lCharpChar

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"))

请更新您的代码它有错误

cChar设为空字符串可以解决此问题。然而,还需要定义lCharpCharnumSpace

还有另外两个问题:result =return行缩进得太远,并且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

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

如果使用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虚拟机

字典方法

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

>>> groups = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ",
...           "abcdefghijklmnopqrstuvwxyz",
...           " trn",
...           "!@#$%^&*()_+=-`~,..;:/?'"[]{}|")
>>> 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方法是三种分组方法中速度最快的一种。

最新更新