web-dev-qa-db-ja.com

同点の場合、Python?

Python)でmax()関数を使用してリスト(またはTuple、dictなど)の最大値を検索し、最大値にタイがある場合Python pick?ランダムですか?

これは、たとえば、タプルのリストがあり、タプルの最初の要素に基づいて(key=を使用して)最大値を選択するが、2番目の要素が異なる場合に関連します。 Pythonどのものを最大値として選択するのですか?

私はPython v2.6。

64
Double AA

Python 2、これはドキュメントでは指定されておらず、標準ライブラリの移植可能なPython内セクションにはないため、この動作は実装によって異なる場合があります。

CPython 2.7のソースでは、これは./Python/bltinmodule.cによってbuiltin_maxで実装されています[ ソース ]、より一般的なmin_max関数をラップします [ ソース ]

min_maxは値を反復処理し、PyObject_RichCompareBoolを使用します [ docs ] それらが現在の値より大きいかどうかを確認します。その場合、大きい値がそれを置き換えます。等しい値はスキップされます。

その結果、同点の場合は最初の最大値が選択されます。

69
Jeremy

経験的なテストから、リストの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')

そして、 ジェレミーの優れた調査 は、これが事実であることを確認します。

21
Daniel DiPaolo

Python 3)の場合、タイの場合のmax()の動作は、他の回答で詳述されているように、単なる実装の詳細ではなくなりました。 Python 3 docs 明示的に述べる:

複数の項目が最大の場合、関数は最初に見つかったものを返します。これは、sorted(iterable、key = keyfunc、reverse = True)[0]やheapq.nlargest(1、iterable、key = keyfunc)などの他のソート安定性保持ツールと一貫しています。

14
Chris_Rands

あなたの質問はいくぶんメモにつながります。データ構造をソートするとき、比較のために等しいと見なされるオブジェクトの相対的な順序を維持したいことがよくあります。これは stable sort として知られています。

この機能がどうしても必要な場合は、sort()を実行できます。これは 安定する であり、元のリストに相対的な順序を知ることができます。

python自体によって、max()を呼び出したときにどの要素が得られるかについての保証が得られるとは思わない。他の答えはcpythonの答えを与えるが、実装(IronPython、Jython)は異なる動作をする可能性があります。

6
Bill Lynch

IMOのPython 2バージョンでは、max()が同数の場合にリスト内の最初の最大要素を返すと想定できないと思います。 max()が真の数学関数maxを実装することになっているので、私はこの信念を持っています。これは、完全な順序を持ち、要素に「隠された情報」がないセットで使用されます。

(他の人が正しく研究しており、Pythonのドキュメントはmax()。の保証を与えないと仮定します)

(一般に、ライブラリ関数の振る舞いについて尋ねることができる無限の質問があり、それらのほとんどすべてに答えることはできません。例えば:どのくらいのスタックスペースがmax()使用しますか?SSEを使用しますか?一時メモリの量は?同じオブジェクトのペアを複数回比較できますか(比較に副作用がある場合)?O(n) timeよりも速く実行できますか? 「特別な」既知のデータ構造の場合などなど)

2
Nayuki