dict - python max index



在平局的情況下,Python選擇哪個最大值? (4)

當在Python中使用max()函數來查找列表中的最大值(或者元組,字典等)並且有一個最大值的關係時,Python會選擇哪一個? 是隨機的嗎?

例如,如果一個具有元組列表並且一個基於元組的第一個元素選擇最大值(使用key= )但是存在不同的第二個元素,則這是相關的。 Python如何選擇哪一個作為最大值?

我在使用Python v2.6。


你的問題有點導致一個註釋。 在對數據結構進行排序時,通常希望保持被認為相等的對象的相對順序以用於比較。 這將被稱為穩定的排序

如果你絕對需要這個功能,你可以做一個sort()它將是穩定的 ,然後知道相對於原始列表的順序。

根據python本身,我不相信你在調用max()時會得到哪個元素。 其他答案給出了cpython答案,但其他實現(IronPython,Jython)可能會有不同的功能。


在Python 2中,這未在文檔中指定,並且不在標準庫的可移植in-Python部分中,因此這種行為可能因實現而異。

在CPython 2.7的源代碼中,這是通過builtin_max [ source ]./Python/bltinmodule.c實現的,它包含了更通用的min_max函數[ source ]

min_max將遍歷值並使用PyObject_RichCompareBool [ docs ]來查看它們是否大於當前值。 如果是這樣,則更大的值將替換它。 將跳過相等的值。

結果是在平局的情況下將選擇第一個最大值。


對於Python 3,在綁定的情況下max()的行為不再僅僅是其他答案中詳述的實現細節。 現在可以保證該功能,因為Python 3文檔明確指出:

如果多個項目是最大的,則該函數返回遇到的第一個項目。 這與其他排序穩定性保留工具一致,例如sorted(iterable,key = keyfunc,reverse = True)[0]和heapq.nlargest(1,iterable,key = keyfunc)。


從經驗測試來看,似乎列表中的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')

傑里米的精彩調查證實了確實如此。





max