在平局的情况下,Python选择哪个最大值?

在平局的情况下,Python选择哪个最大值?,python,max,Python,Max,在Python中使用max()函数查找列表(或元组、dict等)中的最大值时,最大值有一个对应关系,Python会选择哪一个?是随机的吗 例如,如果有一个元组列表,并且根据元组的第一个元素选择一个最大值(使用键=),但存在不同的第二个元素,则这是相关的。Python如何决定选择哪一个作为最大值?根据经验测试,如果出现平局,列表上的max()和min()将返回列表中与max()/min()匹配的第一个: >>> test = [(1, "a"), (1, "b"), (2, "c

在Python中使用
max()
函数查找列表(或元组、dict等)中的最大值时,最大值有一个对应关系,Python会选择哪一个?是随机的吗


例如,如果有一个元组列表,并且根据元组的第一个元素选择一个最大值(使用
键=
),但存在不同的第二个元素,则这是相关的。Python如何决定选择哪一个作为最大值?

根据经验测试,如果出现平局,列表上的
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')

并确认事实确实如此。

它选择它看到的第一个元素。见:

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

在源代码中实现了这一点,它封装了

min\u max
将遍历这些值,并使用以查看它们是否大于当前值。如果是,则较大的值将替换它。将跳过相等的值


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

您的问题在某种程度上引出了一个注释。在对数据结构进行排序时,通常希望保持对象的相对顺序,以便进行比较。这将被称为一场战争

如果您确实需要此功能,可以执行排序(),然后了解相对于原始列表的顺序


就python本身而言,我不相信您能保证在调用
max()
时得到哪个元素。其他答案给出了cpython的答案,但其他实现(IronPython、Jython)的功能可能不同。

对于Python2版本,IMO,我相信您不能假设
max()
在ties的情况下返回列表中的第一个最大元素。我有这个信念,因为
max()
应该实现真正的数学函数
max
,它用于具有总顺序的集合,并且元素没有任何“隐藏信息”

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


(通常,关于库函数的行为,您可以问无数个问题,几乎所有问题都无法回答。例如:
max()
将使用多少堆栈空间?它将使用SSE吗?有多少临时内存?它能否多次比较同一对对象(如果比较有副作用)?对于“特殊的”已知数据结构,它的运行速度是否能超过O(n)时间?等等)

对于Python 3,在绑定的情况下
max()
的行为不再只是其他答案中详述的实现细节。该功能现在已得到保证,如下所示:

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


请不要试图依靠这些来实现排序功能。请看我同意缺失的答案。不,这不是你应该依赖的行为。我希望你只是出于调试的目的。如果你关心元组的第二个元素(在你假设的例子中),那么你应该总是在你的key =函数中考虑它。但你仍然需要保证,对于相同的输入,相同的对象将是最大值。克里斯,我想我关于meta的问题为你赢得了一些当之无愧的投票:)有没有办法得到最后一个而不是第一个(无需进行排序)?@lifebalance在应用max()之前反转列表@生命平衡或替代。(稍有不同,那一个得到了索引)@DoubleAA字典是按哪个条目先从CPython 3.6和更高版本开始插入的顺序排列的,任何其他Python实现都是以Python 3.7umm开始的,真的吗?由于max(['ab','ba'])返回'ba',无法在doc中找到原因!max(['ab','ba'])返回什么?猜测是“巴”!