我正在尝试使用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
之前,您正在更新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"))
请更新您的代码它有错误
将cChar
设为空字符串可以解决此问题。然而,还需要定义lChar
、pChar
和numSpace
。
还有另外两个问题: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
方法是三种分组方法中速度最快的一种。