【问题标题】:TypeError: ord() expected a character, but string of length 2 foundTypeError: ord() 需要一个字符,但找到长度为 2 的字符串
【发布时间】:2019-05-08 13:41:07
【问题描述】:

我遇到了一个尴尬的问题。

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_sstringc always 字符被分配。这种情况很少发生,因此很难重新产生问题。 c 变量是否有长度为 2 的字符串?

【问题讨论】:

  • 请向我们展示input_s 列表...
  • @StephenRauch e_count = sum('a' &lt;= c.lower() &lt;= 'z' for c in input_s)(但仍然没有回答问题。)
  • @DYZ,实际上你可能会回答这个问题,因为它会消除 str len 2 错误。
  • @StephenRauch 它可能会隐藏问题但不能解决问题。为什么字符串的一个元素会是一个有多个字符的字符串?
  • @hygull 在 python3 中没有这样的问题,Keanu 可以分享一下你是如何创建input_s 的,问题与它无关。这是一个类型不匹配的问题

标签: python python-3.x


【解决方案1】:

即使c 是一个代码点,c.lower() 也可能是多个。例如,U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE,小写为常规的i,后跟 U+0307 COMBINING DOT ABOVE:

>>> 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' &lt;= c &lt;= '\x7f'0 &lt;= ord(c) &lt;= 127 测试单个字符的 ASCII 特性,或者您可以硬编码哪些范围是 ASCII 字母并使用 'A' &lt;= c &lt;= 'Z' or 'a' &lt;= c &lt;= 'z' 测试字符的 ASCII 字母特性。

【讨论】:

    【解决方案2】:

    您可能正在使用元组(或任何序列)作为 input_s。 如果序列中的第一个元素是长度为 2 的字符串,则会出现相同的错误。 如果是这种情况,您使用字符串(或拆分序列),代码应该可以正常工作。

    【讨论】:

    • 你怎么能这么肯定?如果 OP 使用元组,则代码将永远无法工作。 OP 声称该错误非常罕见。
    • 如果不是元组,它将是一个序列(列表,元组或集合),否则错误将没有意义
    • 不,你可以说comming数据不是字符,但你不能说它是什么
    • 将我最初的答案更改为“也许”作为一个序列是一个概率。如果输入是一个序列并且第一项是长度为 2 的字符串,则代码将给出相同的错误。这完全取决于 input_s 是什么。可能还有很多其他原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多