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

77 投票
5 回答
47484 浏览
提问于 2025-04-16 22:01

在Python中,当你使用max()函数来找出一个列表(或者元组、字典等)中的最大值时,如果出现了多个相同的最大值,Python会选择哪一个呢?是随机的吗?

这个问题很重要,比如说你有一个元组的列表,你想根据元组的第一个元素来找最大值,但这些元组的第二个元素却不一样。那Python是怎么决定选哪个作为最大值的呢?

5 个回答

17

在Python 3中,当多个值相等时,max()函数的表现不再只是实现细节,其他回答中提到的内容现在已经变得明确。根据Python 3的官方文档,这个特性是有保证的:

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

22

通过实际测试,我们发现当在一个列表上使用 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')

而且,Jeremy 的出色调查 也证实了这一点。

83

它会选择它看到的第一个元素。看看关于max()的文档

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

在源代码中,这个功能是通过./Python/bltinmodule.c中由builtin_max实现的,它封装了更通用的min_max函数

min_max会遍历所有的值,并使用PyObject_RichCompareBool来判断它们是否大于当前的值。如果是的话,就用更大的值替换掉当前值。相等的值会被跳过。

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

撰写回答