3

私はカウンターの辞書を持っています、例えば:

from collections import Counter, defaultdict

numbers = defaultdict(Counter)

numbers['a']['first'] = 1
numbers['a']['second'] = 2
numbers['b']['first'] = 3

合計を取得したい: 1+2+3 = 6

Python 3でこれを行う最も簡単な/慣用的な方法は何ですか?

4

3 に答える 3

7

ネストされた内包表記を使用します。

sum(x for counter in numbers.values() for x in counter.values())

または、最初にカウンター (空のカウンターから開始) を合計し、次にそれらの値を合計します。

sum(sum(numbers.values(), Counter()).values())

または、最初に各カウンターの値を取得し、次に中間結果を取得します。

sum(sum(c.values()) for c in numbers.values())

またはチェーンを使用します:

from itertools import chain
sum(chain.from_iterable(d.values() for d in numbers.values()))

私は最初の方法を好みます。

于 2013-03-11T23:47:33.880 に答える
2
sum(sum(c.values()) for c in numbers.values())
于 2013-03-11T23:49:18.443 に答える
1
from itertools import chain
sum(chain.from_iterable(d.values() for d in numbers.values()))
# outputs: 6

Python 2.xでのパフォーマンスの使用に関しては.itervalues()、中間リストの作成を回避します (ここのすべてのソリューションに適用されます)。

sum(chain.from_iterable(d.itervalues() for d in numbers.itervalues()))
于 2013-03-11T23:47:04.260 に答える