我遇到了一个尴尬的问题。
TypeError: ord() expected a character, but string of length 2 found
我的代码:
for c in input_s:
if ord('a') <= ord(c.lower()) <= ord('z'):
e_count += 1
我希望输入for c in input_s
和string
始终为c
的字符。这种情况很少发生,因此很难重现。 c
变量是否有length2字符串?
答案 0 :(得分:4)
即使c
是一个代码点,c.lower()
也可能是多个。例如,对于U + 0130上方带有点的拉丁字母大写字母I,将其小写为常规i
,后跟U + 0307上方的组合点:
>>> x = '\u0130'
>>> len(x)
1
>>> len(x.lower())
2
c.upper()
也会发生同样的情况。 eszett:
>>> x = 'ß'
>>> x.upper()
'SS'
>>> len(x)
1
>>> len(x.upper())
2
您的ord(c.lower())
通话从根本上来说是不正确的。如果要测试字符是大写还是小写ASCII字母,可以使用isascii
来测试字符是否在0-127 ASCII范围内,并使用isalpha
来测试它是否是字母字符。您还可以使用这些方法一次测试整个字符串。例如,
if input_s.isascii() and input_s.isalpha():
...
将测试input_s
是否为仅包含ASCII字母字符的非空字符串。 (“非空”部分是因为isalpha
对于空字符串返回False。)
isascii
是非常新的东西,在Python 3.7中引入。如果必须支持较旧的Python版本,则可以使用'\x00' <= c <= '\x7f'
或0 <= ord(c) <= 127
测试单个字符的ASCII样式,也可以硬编码ASCII字母范围的字符并使用ASCII字母的样式测试字符'A' <= c <= 'Z' or 'a' <= c <= 'z'
。
答案 1 :(得分:0)
您可能正在使用元组(或任何序列)作为input_s。 如果序列中的第一个元素是长度为2的字符串,则会得到相同的错误。 如果是这种情况,则使用字符串(或拆分序列),代码应该可以正常工作。