【问题标题】:When is `string.swapcase().swapcase()` not equal to `string`?什么时候`string.swapcase().swapcase()`不等于`string`?
【发布时间】:2020-05-02 18:20:43
【问题描述】:

Documentation for str.swapcase() 方法说:

返回字符串的副本,其中大写字符转换为小写字符,反之亦然。 请注意,s.swapcase().swapcase() == s 不一定是真的。

我想不出s.swapcase().swapcase() != s的例子,谁能想到一个?

【问题讨论】:

    标签: python python-3.x string character-encoding character


    【解决方案1】:

    一个简单的例子是:

    s = "ß"
    
    print(s.swapcase().swapcase())
    

    输出:

    ss
    

    ß is German lowercase double s(正确的大写版本是)。发生这种情况的原因是 Python 不“知道”或不想为每个 unicode 符号定义大写转换。因此,通过将s.swapcase() 评估为"SS" 采取了简单的方法,因此s.swapcase().swapcase()"ss"

    【讨论】:

    • 你会知道为什么会这样吗? "ß" 的小写或大写是什么?我不清楚,为什么输出是 ss?
    • 我最喜欢的例子来反驳一个人的直觉,即 case world's 是土耳其大写字母 I 带点和小写无点 i。试试s = 'ıİ' 看看会发生什么。
    • “ß”到“ss”的映射由 Unicode 联盟定义 - 请参阅 ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt。 Python 不是“知道”或“决定”任何东西,它是在执行标准。 Python 在每个版本中捆绑了 Unicode 数据库的副本,并在该数据库中查找字符信息; Python 不会对案例映射等做出独立决定。
    【解决方案2】:

    事实上,有很多例子:它发生在一些希腊符号、德国符号、亚美尼亚符号和其他特定/特殊符号上。

    全部获取:

    find_dif = lambda s: s.swapcase().swapcase() != s
    
    [chr(s) for s in range(100000) if find_dif(chr(s))]
    

    你会得到:

    ['µ', 'ß', '一世', '一世', 'ʼn', 'ſ', 'ǰ', 'ͅ', 'ΐ', 'ΰ', ' ', 'ϐ', 'θ', 'φ', 'ϖ', 'ϰ', 'ϱ', 'ϴ', 'ε', 'և', 'ᲀ', 'ᲁ', 'ᲂ', 'ᲃ', 'ᲄ', 'ᲅ', 'ᲆ', 'ᲇ', 'ᲈ', 'H', 'ẗ', 'ẘ', 'ẙ', '一种', 'F', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', '我', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'Ω', 'K', '一种', 'f', 'fi', 'f', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ']

    让我们检查一下:

    s1 = 'µ'
    s2 = s1.swapcase().swapcase()
    
    s1 == s2
    

    错误

    s1 = 'ß'
    s2 = s1.swapcase().swapcase()
    
    s1 == s2
    

    错误

    s1 = 'ﬗ'
    s2 = s1.swapcase().swapcase()
    
    s1 == s2
    

    错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2019-04-13
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多