对包含不可比较元素的Python元组进行排序

Bob*_*nia 2 python sorting tuples

当尝试比较字典时,python 会引发 TypeError:

{"a" : "b"} < {"a" : "b"} # TypeError

当尝试比较元组时,Python 按元素进行比较:

(1, 2) > (1, 1) # True

因此,我预计如果字典前面的元素相等,则比较包含字典的元组将导致 TypeError,因为随后将被迫比较字典,这将引发 TypeError。不是这种情况:

(3, {"a" : "b"}) < (3, {"a" : "b"}) # False, no TypeError

我已经通读了我能找到的有关 Python 排序的文档,但没有看到任何记录此行为的内容。我可以相信这种行为在未来版本中保持不变吗?

Dan*_*ejo 6

文档中对此进行了解释:

内置集合之间的词典比较工作如下:

要使两个集合比较相等,它们必须具有相同的类型、相同的长度,并且每对对应的元素必须比较相等(例如,[1,2] == (1,2) 为 false,因为类型不一样)。

支持顺序比较的集合的顺序与其第一个不相等元素的顺序相同(例如,[1,2,x] <= [1,2,y] 与 x <= y 具有相同的值)。如果相应的元素不存在,则首先对较短的集合进行排序(例如,[1,2] < [1,2,3] 为 true)。

因此,元组比较要做的第一件事就是找到不相等的元素,因为你的元组中没有不相等的元素,结果是False,并且不需要调用 的代码<

通过查看元组比较的实现进一步证实了这一点:

for (i = 0; i < vlen && i < wlen; i++) {
    int k = PyObject_RichCompareBool(vt->ob_item[i],
                                     wt->ob_item[i], Py_EQ);
    if (k < 0)
        return NULL;
    if (!k)
        break;
}

if (i >= vlen || i >= wlen) {
    /* No more items to compare -- compare sizes */
    Py_RETURN_RICHCOMPARE(vlen, wlen, op);
}
Run Code Online (Sandbox Code Playgroud)

上面代码中的 for 循环尝试查找第一个不相等的元素,如果找不到,则将比较委托给元组的大小。