15

Pythonで、リストのリストでmaximumBy (テスト用の比較関数を使用する高階関数)を実行する慣用的な方法は何ですか?ここで、比較したいのはリストの合計です。

Haskellの実装と出力例は次のとおりです。

> maximumBy (compare `on` sum) [[1,2,3],[4,5,6],[1,3,5]]
> [4,5,6]

そして、完全を期すために、これらの基本ライブラリ関数の実装(reduceなどを使用したい場合:)

maximumBy cmp xs =  foldl1 maxBy xs
    where
       maxBy x y = case cmp x y of GT -> x; _ -> y

k `on` f = \x y -> f x `k` f y

sum      =  foldl' (+) 0
4

3 に答える 3

41

Python 2.5以降、キーパラメータでmaxを使用できます。

>>> max(a, key=sum)
[4, 5, 6]
于 2010-05-04T05:35:08.427 に答える
1

それほど効率的ではありませんが、次のようになります。

reduce(lambda x,y: x if sum(x)>sum(y) else y, [[1,2,3],[4,5,6],[1,3,5]])
于 2010-05-04T05:37:55.217 に答える
1

max にキー パラメータがない場合は、DSU パターンを明示的にコーディングできます。

max(izip(imap(sum,a),a))[1]

izipimappython 2 の itertools モジュールからのもので、zip と map が行うことを行いますが、Python ジェネレーターを怠惰に使用して、中間リストのコンスを回避します。Python 3 では、map および zip ビルトインは遅延しています。

于 2011-05-31T21:25:32.817 に答える