3

私は名前と年齢の辞書を持っています。一部の名前は同一です。同一の名前の年齢を合計したい。

私の偽のデータは次のようになります。

pete: 33
ann: 7
ruth: 3
ann: 5
austin: 90

例には 2 つの ann があります。そこで、2 人の年齢を合計したいと思います。現在、私は辞書を持っています:

dict = {'pete':33,'ann':7,'ruth':3,'ann':5,'austin':90}

私の結果は次のようになります

dict = {'pete':33,'ann':12,'ruth':3,'austin':90}

pete: 33
ann: 12
ruth: 3
austin: 90

このようにデータを辞書に入れることは最善の解決策ではないと思います。データを保存して出力に処理するための他の良い解決策は何ですか?

4

3 に答える 3

4

あなたの偽のデータはそのようには見えません。ディクショナリに同じキーを持つ 2 つのエントリを持つことは不可能です。おそらく別のデータ構造を使用するつもりでしたか? (辞書ではありません)。しかし、データが次のようになっているとします。

input = [('pete', 33), ('ann',7), ('ruth',3), ('ann',5), ('austin',90)]

次に、 adefaultdictは良い考えです:

from collections import defaultdict
d = defaultdict(int)

for k, v in input:
    d[k] += v

d
=> defaultdict(<type 'int'>, {'pete': 33, 'ann': 12, 'ruth': 3, 'austin': 90})

またはを使用してCounter

from collections import Counter
d = Counter()

for k, v in input:
    d.update({k:v})

d
=> Counter({'austin': 90, 'pete': 33, 'ann': 12, 'ruth': 3})

さらに、追加のライブラリをインポートしない別のソリューション:

d = {}
for k, v in input:
    if k in d:
        d[k] += v
    else:
        d[k] = v

d
=> {'pete': 33, 'ann': 12, 'ruth': 3, 'austin': 90}
于 2013-07-30T22:51:16.517 に答える
3
data = [('pete', 33), ('ann', 7), ('ruth', 3), ('ann', 5), ('austin', 90)]

辞書には重複したキーを含めることはできないため、代わりにタプルのリストから始めることができます。

from collections import defaultdict
combined = defaultdict(int)

for name, age in data:
    combined[name] += age

dict次に、を使用してビルドしdefaultdictます。秘訣は、defaultdict(int)存在しないキーを処理する必要がないように、エントリがデフォルトで 0 になる dict を作成することです。

于 2013-07-30T22:54:45.213 に答える
3

辞書を使用する代わりに、タプルのリストを使用する必要があります

pairs = [ ('pete', 33), ('ann', 7), ('ruth', 3), ('ann', 5), ('austin', 90) ]

次に、defaultdict を使用して合計を計算できます。

from collections import defaultdict
answer = defaultdict(int)
for name, number in pairs:
    answer[name] += number

print(answer)

defaultdict は、指定された関数 (int) を呼び出して、存在しないキーのデフォルト値を与えることによって機能します (int() は都合よく 0 を返します)。次に、反復ごとに番号がそれに追加されます。

于 2013-07-30T22:56:50.453 に答える