在Python中使用max()
函数来查找列表中的最大值(或元组,字典等)时,最大值是一个平局,Python选择哪一个?它是随机的吗?
例如,如果一个元组具有元组列表并且一个元组基于元组的第一个元素选择最大值(使用key=
)但是存在不同的第二个元素,则这是相关的。 Python如何选择哪一个作为最大值?
我正在使用Python v2.6。
答案 0 :(得分:69)
答案 1 :(得分:20)
从经验测试来看,列表中的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')
Jeremy's excellent sleuthing确认情况确实如此。
答案 2 :(得分:14)
对于Python 3,max()
在关系情况下的行为不再仅仅是其他答案中详述的实现细节。现在可以保证该功能,因为Python 3 docs显式声明:
如果多个项目是最大的,则该函数返回第一个 遇到。这与其他排序稳定性保持一致 sort(iterable,key = keyfunc,reverse = True)[0]和 heapq.nlargest(1,iterable,key = keyfunc)。
答案 3 :(得分:6)
你的问题在某种程度上导致了一个注释。在对数据结构进行排序时,通常希望保持被认为相等的对象的相对顺序以用于比较。这将被称为stable sort。
如果您绝对需要此功能,则可以执行sort()
will be stable,然后了解相对于原始列表的订单。
根据python本身,我不相信您在致电max()
时会得到哪些元素。其他答案给出了cpython答案,但其他实现(IronPython,Jython)的功能可能不同。
答案 4 :(得分:2)
对于Python 2版本,IMO,我相信你不能假设max()
在关系的情况下返回列表中的第一个最大元素。我有这样的信念,因为max()
应该实现真正的数学函数max
,它用于具有总顺序的集合,并且元素没有任何“隐藏信息”。
(我会假设其他人已经正确研究过,而且Python文档没有对max()
提供任何保证。)
(一般来说,你可以询问有关库函数行为的无数问题,而且几乎所有这些问题都无法解答。例如:多少堆栈空间{{1使用?它会使用SSE吗?多少临时内存?可以多次比较同一对对象(如果比较有副作用)?对于“特殊”已知数据,它能否比O(n)时间运行得快结构?等等。)