web-dev-qa-db-ja.com

辞書でリデュースを使用する方法

Pythonの辞書でreduceを使用する方法を理解するのにいくつか問題があります。たとえば、次の辞書があります。

_{1: 3, 2: 1, 3: 2}_

そして私は以下を計算しようとしています:

_s = 0
for i in h:
    s += h[i] * (h[i] - 1)
_

これは期待どおりに機能します(次のようになります:_8_)。ただし、パラダイムを削減するために変換しようとすると失敗します:reduce(lambda x, y: x + y * (y - 1), h)、しかし間違った答えが返ってきます。

これは、値ではなくキーを使用しているためだと思います。適切に削減するためにコードをどのように変換できますか?

14
Salvador Dali

ディクショナリを繰り返し処理し、初期値を0にしてディクショナリを減らす必要があります。

ディクショナリを反復し、実際にはキーを反復するため、値を取得するにはディクショナリにインデックスを付ける必要があることに注意してください。

reduce(lambda x, key:x + h[key] * (h[key] - 1), h, 0)

あるいは、あなたは辞書の値にのみ興味があるので、キーについてはほとんど気にせず、辞書の値を繰り返すだけです

Python 2.X

reduce(lambda x, value:x + value * (value - 1), h.itervalues(), 0)

Python 3.X

reduce(lambda x, value:x + value * (value - 1), h.values(), 0)
29
Abhijit