在领带情况下,Pythonselect哪个最大值?

当在Python中使用max()函数来查找列表(或元组,字典等)中的最大值时,最大值有一个关系,Pythonselect哪一个? 它是随机的吗?

这是相关的,例如,如果有一个元组列表,并且一个基于元组的第一个元素select最大值(使用key= ),但是有不同的第二个元素。 Python如何挑选哪一个挑选最大值?

我正在使用Python v2.6。

在Python 2中,这不是在文档中指定的,也不在标准库的可移植的Python部分中,所以这种行为在实现中可能会有所不同。

在CPython 2.7的源代码中,这是通过builtin_max [ source ]./Python/bltinmodule.c实现的,它包装了更一般的min_max函数[ source ]

min_max将遍历这些值并使用PyObject_RichCompareBool [ docs ]来查看它们是否大于当前值。 如果是这样,更大的价值将取代它。 等值将被跳过。

结果是在平局的情况下将select第一个最大值。

从经验testing中看,列表中的max()min()会在匹配时返回匹配max() / min()中的第一个:

 >>> test = [(1, "a"), (1, "b"), (2, "c"), (2, "d")] >>> max(test, key=lambda x: x[0]) (2, 'c') >>> test = [(1, "a"), (1, "b"), (2, "d"), (2, "c")] >>> max(test, key=lambda x: x[0]) (2, 'd') >>> min(test, key=lambda x: x[0]) (1, 'a') >>> test = [(1, "b"), (1, "a"), (2, "d"), (2, "c")] >>> min(test, key=lambda x: x[0]) (1, 'b') 

而杰里米的出色调查证实了确实如此。

对于Python 3,在关系情况下max()的行为不再仅仅是一个实现细节,详见其他答案。 现在保证了这个function,正如Python 3文档明确指出的那样:

如果多个项目是最大的,该函数返回遇到的第一个。 这与sorting(iterable,key = keyfunc,reverse = True)[0]和heapq.nlargest(1,iterable,key = keyfunc)等其他sorting稳定性保持工具一致。

你的问题有时会引起注意。 在对数据结构进行sorting时,为了比较的目的,经常希望保持被认为相等的对象的相对顺序。 这将被称为稳定的sorting 。

如果你绝对需要这个function,你可以做一个sort() , 它将是稳定的 ,然后知道相对于原始列表的顺序。

根据python本身,我不相信当你调用max()时,你会得到哪个元素的保证。 其他答案给出了cpython的答案,但其他实现(IronPython,Jython)可能会有不同的function。

对于Python 2的版本,IMO,我相信你不能假设max()在关系的情况下返回列表中的第一个最大元素。 我有这个信念,因为max()应该实现真正的math函数max ,它被用在具有全部顺序的集合上,而元素没有任何“隐藏的信息”。

(我会假定其他人已经正确研究了,Python文档没有为max()提供任何保证。)

(一般来说,关于库函数的行为可以问的问题不胜枚举,几乎所有的问题都不能回答,例如: max()使用多less堆栈空间,会使用SSE ?多less临时内存?是否可以多次比较同一对对象(如果比较有副作用)?对于“特殊”已知数据结构,它可以比O(n)时间快吗?等等)