2

いくつかのコードでとても忙しく、基本的に各値がリストである辞書を取り、最大のリストを持つキーを返す関数があります。

私は次のように書いた:

def max_list(dic):
    if dic:
        l1 = dic.values()
        l1 = map(len, l1)
        l2 = dic.keys()
        return l2[l1.index(max(l1))]
    else:
        return None

他の誰かが次のように書いています。

def max_list(dic):
    result = None
    maxValue = 0
    for key in dic.keys():
        if len(dic[key]) >= maxValue:
            result = key
            maxValue = len(dic[key])
    return result

もしあれば、これを行うための「正しい」方法はどれでしょう。これがコミュニティウィキと見なされないことを願っています(コードは機能しますが)。問題の観点から、どちらが最良のパターンであるかを理解しようとしています。

4

3 に答える 3

6

別の有効なオプション:

maxkey,maxvalue = max(d.items(),key=lambda x: len(x[1]))

上記の2つのうち、すべての種類の中間オブジェクトを破棄するためだけに生成するわけではないため、明示的なforループを使用することをお勧めします。


ちなみに、このソリューションは空のdictでは特にうまく機能しません...(それはを発生させますValueError)。これは(標準ではなく)珍しいケースだと思うので、try-except ValueErrorブロックで囲むことは問題ありません。

于 2012-10-16T20:59:18.583 に答える
4

最もpythonicはmax(dic,key=lambda x:len(dic[x]))...少なくとも私は思うだろう...

読みやすさを最大化し、コード行を最小化することはpythonicです...通常

于 2012-10-16T20:59:26.923 に答える
1

自分自身に問いかけるべき質問は、コードの保守性と計算速度のどちらが最も重要だと思いますか。

他の回答が指摘しているように、この問題にはマップを使用した非常に簡潔な解決策があります。ほとんどの人にとって、この実装はおそらくループを使用した実装よりも読みやすいでしょう。

計算速度の点では、マップソリューションの効率は低下しますが、それでも同じ計算マグニチュートになります。

したがって、mapメソッドのパフォーマンスが著しく低下する可能性は低いと思います。プログラムの終了後にプロファイラーを使用することをお勧めします。そうすれば、プログラムの実行速度が希望よりも遅くなった場合に、実際の問題がどこにあるかを確認できます。

于 2012-10-16T21:14:55.687 に答える