当max()
在Python中使用该函数在列表(或元组,字典等)中查找最大值时,并且最大值与并列,Python会选择哪一个?它是随机的吗?
例如,如果有一个元组列表,并且key=
根据元组的第一个元素选择一个最大值(使用),但是有不同的第二个元素,则这是有意义的。Python如何决定选择哪个最大?
当max()
在Python中使用该函数在列表(或元组,字典等)中查找最大值时,并且最大值与并列,Python会选择哪一个?它是随机的吗?
例如,如果有一个元组列表,并且key=
根据元组的第一个元素选择一个最大值(使用),但是有不同的第二个元素,则这是有意义的。Python如何决定选择哪个最大?
Answers:
它选择看到的第一个元素。请参阅有关文档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
查看它们是否大于当前值。如果是这样,则较大的值将替换它。相等的值将被跳过。
结果是在平局的情况下将选择第一个最大值。
从经验测试来看,如果出现平局,则max()
and会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')
和Jeremy的优秀侦探证实,这确实是这样的。
对于Python 3,在max()
有联系的情况下,行为不再仅仅是实现细节,如其他答案中所述。现在可以保证该功能,因为Python 3文档明确声明:
如果有多个最大项,则该函数返回遇到的第一个项。这与其他排序稳定性保存工具(例如
sorted(iterable, key=keyfunc, reverse=True)[0]
和)一致heapq.nlargest(1, iterable, key=keyfunc)
。