2011-12-05 16 views
8

組み込み関数maxminのPythonでのドキュメントは、keyパラメータがsort関数の場合と同じように動作する必要があることを示しています。言い換えれば、私はこれを行うことができる必要があります:Python組み込みのmax/min関数のデフォルトキー

a = [1, 2, 3, 4] 
max(a, key=None) 

をただし、これはエラーを発生させます: TypeError: 'NoneType' object is not callable

しかし、私はsort機能と似た何かをする場合、私は期待どおりの結果を得ます:

a = [1, 2, 3, 4] 
a.sort(key=None) 

エラーは生成されず、デフォルトのソートが使用されます。いくつかの本はまた、私がmaxminの機能で同じ振る舞いで逃げることができなければならないことを示唆しています。この抜粋をPython in a Nutshellからご覧ください。

実際これはmaxmin機能のデフォルトの動作ですか?それはすべきでしょうか?ソート関数と一致してはいけませんか?

答えて

23

言語の問題以上に、.sortmaxの実装の違いに遭遇しました。

list.sort()は、デフォルトで「なし」になるキーワード引数「キー」を受け取ります。つまり、ソートメソッドでは、key=None引数を指定した場合とデフォルト値をとった場合の差を区別することはできません。いずれの場合も、キー機能が提供されていないかのように動作します。一方、キーワード引数「キー」が存在するかどうかをチェックしています。それはデフォルト値を持っておらず、その値はキー機能として使用されています。

どちらの方法でも、キーは決してNoneとして供給されるべきではありません。これは、リスト/イテラブル内の項目から「キー」値を抽出するために使用される関数であると考えられています。たとえば:

a = [("one", 1), ("two", 2), ("three", 3), ("four", 4)] 
a.sort(key=lambda item:item[1]) 
+0

感謝:ちょうど追加し、あなたが迷っている場合には、(sort中およびmax/min機能の両方の)デフォルトkey値は何かのようです。私はこれらの機能の実際の実装が異なっていたことを知っていましたが、私が見つけることができたすべてのドキュメントがこの違いを明示的にしていないと不満を感じました。 –

+0

問題ありません。これがあなたの質問に答えるなら、それを受け入れることは常に感謝します。 –

+1

"key"は本当にひどい名前です... – OlivierBlanvillain

7

@ Davidの回答は完璧です。応答のための

lambda x: x 
+1

しかし、ソートはデフォルト値としてNoneを渡しますが、min/maxはそうしません。だから、何かが異なって実装されています。コードを見ると、minとmax関数は単に引数辞書に定義されているかどうかをチェックするだけです。私は最大/最小キー引数のデフォルト値があるとは信じていません。デフォルトの動作だけです。 –

関連する問題