6

次の形式の辞書があります。

{"a": (1, 0.1), "b": (2, 0.2), ...}

各タプルは (スコア、標準偏差) に対応します。各タプルの最初の整数だけの平均を取るにはどうすればよいですか? 私はこれを試しました:

for word in d:
    (score, std) = d[word]
    d[word]=float(score),float(std)
    if word in string:
        number = len(string)
        v = sum(score)
        return (v) / number

このエラーを取得します。

    v = sum(score)
TypeError: 'int' object is not iterable
4

1 に答える 1

8

リスト内包表記を使えば簡単です。まず、 からすべてのディクショナリ値を取得できますd.values()。各値の最初の項目だけのリストを作成するには、 のようなリストを作成します[v[0] for v in d.values()]。次に、これらの要素の合計を取り、辞書内の項目数で割ります。

sum([v[0] for v in d.values()]) / float(len(d))

Pedro が正しく指摘しているように、これは実際にリストを作成し、次に合計を計算します。巨大な辞書がある場合、これは大量のメモリを消費し、非効率になる可能性があるため、リスト内包表記の代わりにジェネレーター式が必要になります。この場合、これは 1 組のブラケットを取り除くことを意味します。

sum(v[0] for v in d.values()) / float(len(d))

2 つの方法は別の質問で比較されます。

于 2012-10-20T21:07:02.250 に答える