【问题标题】:Python lexicographic string ordering on unicode stringsunicode字符串上的Python字典字符串排序
【发布时间】:2015-01-20 05:02:27
【问题描述】:

对于 ascii 字符串 'b' > 'a''aa' > 'a',Python 的字符串排序相当简单,就像字典排序一样。但是当字符串是 unicode 时会发生什么?

我希望大于具有以下行为:

def greater_than(s1, s2):
    return tuple(map(ord, s1)) > tuple(map(ord, s2))

即我们按字典顺序比较每个序数。这是python做的吗?

utf-8 编码根据序列中的字节数以递增的顺序对字符的第一个字节进行编码,因此如果字符串是 utf-8 编码的,则字节比较就可以完成。我也想知道比较是否以这种方式实现。

【问题讨论】:

  • 我认为这是在PyUnicode_Compare完成的,还没有找到它的来源。

标签: string python-3.x unicode


【解决方案1】:

PyUnicode_Compare 在这里定义:http://svn.python.org/projects/python/trunk/Objects/unicodeobject.c

它调用unicode_compare,一个静态函数。您可以看到有两个版本:一个使用“修复”表来处理无法直接作为数字比较的值,另一个是幼稚的实现。 “更智能”的实现目前被 #if 0 隐藏,这表明 Python 只是在比较序数值:

while (len1 > 0 && len2 > 0) {
    Py_UNICODE c1, c2;

    c1 = *s1++;
    c2 = *s2++;

    if (c1 != c2)
        return (c1 < c2) ? -1 : 1;

    len1--; len2--;
}

【讨论】:

  • svn repo 是不是有点过时了?看起来与 2 天前更新的 github version 完全不同。只是想知道从那以后它是否发生了变化(希望没有)。
  • @simonzack:确实。我刚拿了我在 Google 上找到的第一个。
猜你喜欢
  • 2011-11-12
  • 2011-07-22
  • 2016-03-04
  • 2012-04-21
  • 2014-10-01
  • 2018-02-16
  • 2017-11-19
  • 2013-02-03
相关资源
最近更新 更多