在领带情况下,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)时间快吗?等等)