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

Dou*_* AA 70 python max

max()在Python中使用函数来查找列表中的最大值(或元组,字典等)时,最大值是一个平局,Python选择哪一个?是随机的吗?

例如,如果一个具有元组列表并且一个key=基于元组的第一个元素选择最大值(使用a )但是存在不同的第二个元素,则这是相关的.Python如何选择哪一个作为最大值?

我在使用Python v2.6.

小智 74

在Python 2中,这未在文档中指定,并且不在标准库的可移植in-Python部分中,因此这种行为可能因实现而异.

在CPython 2.7的源代码中,这是max()sorted(iterable, key=keyfunc, reverse=True)[0] [ source ]实现的,它包含了更通用的heapq.nlargest(1, iterable, key=keyfunc)函数  [ source ].

./Python/bltinmodule.c将迭代值并使用builtin_max [ docs ]查看它们是否大于当前值.如果是这样,则更大的值将替换它.将跳过相等的值.

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


Dan*_*olo 21

从经验测试来看,似乎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')
Run Code Online (Sandbox Code Playgroud)

Jeremy的优秀侦探证实,这确实是这样的.


Chr*_*nds 14

对于Python 3,在max()tie的情况下的行为不再仅仅是其他答案中详述的实现细节.现在可以保证该功能,因为Python 3文档明确指出:

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

  • @lifebalance在应用max()之前反转列表 (2认同)