Python在平局情况下选择哪个最大值?
在Python中,当你使用max()
函数来找出一个列表(或者元组、字典等)中的最大值时,如果出现了多个相同的最大值,Python会选择哪一个呢?是随机的吗?
这个问题很重要,比如说你有一个元组的列表,你想根据元组的第一个元素来找最大值,但这些元组的第二个元素却不一样。那Python是怎么决定选哪个作为最大值的呢?
5 个回答
在Python 3中,当多个值相等时,max()
函数的表现不再只是实现细节,其他回答中提到的内容现在已经变得明确。根据Python 3的官方文档,这个特性是有保证的:
如果有多个项目是最大的,函数会返回第一个遇到的那个。这和其他保持排序稳定性的工具,比如
sorted(iterable, key=keyfunc, reverse=True)[0]
和heapq.nlargest(1, iterable, key=keyfunc)
是一致的。
通过实际测试,我们发现当在一个列表上使用 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 的出色调查 也证实了这一点。
它会选择它看到的第一个元素。看看关于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
来判断它们是否大于当前的值。如果是的话,就用更大的值替换掉当前值。相等的值会被跳过。
结果是,在出现平局的情况下,会选择第一个最大的值。