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 排序的文档,但没有看到任何记录此行为的内容。我可以相信这种行为在未来版本中保持不变吗?
文档中对此进行了解释:
内置集合之间的词典比较工作如下:
要使两个集合比较相等,它们必须具有相同的类型、相同的长度,并且每对对应的元素必须比较相等(例如,[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 循环尝试查找第一个不相等的元素,如果找不到,则将比较委托给元组的大小。