2016-08-15 63 views
0

私はデータベースから取得するリストを持っています。どのようにPythonで辞書の値を合計するには?

[{ 
    'name': 'John', 
    'score': 30 
}, { 
    'name': 'Jan', 
    'score': 23 
}, { 
    'name': 'Mike', 
    'score': 34 
}] 

Can numpyスコアの合計を取得しますか? (ループなしの1から1ずつfor inを使用して)

+0

が重複していないです、私はちょうど 'score'を追加したい、と私は' numpy.sum(リスト) ' –

+0

おおのような1で1をループせずに言及しました。 。はい、わかった。引っ込められた!!私は、同様に言及するために見出しを更新することをお勧めします。ちょっと誤解を招く。ループなし部分は最後にのみ存在します。 – Iceman

+1

タイトルが誤解を招くことがあります。これは列ではありません。それは辞書の価値です。 – hpaulj

答えて

3

あなたはすべての「スコア」を集めsumリストの内包表記を行うことで、これを行うことができます。

sum([x['score'] for x in MyListOfDictionaries]) 

(PS numpyのは必要ありません。ここでは)


編集:@sebastiで指摘したようにコメントでは、我々は直接関数にこれを差し込むているので、リスト内包周りのブラケットが必要ではない、すなわち:

sum(x['score'] for x in MyListOfDictionaries) 

これは「発電機」構文として知られています。パフォーマンスの観点からは、リストを処理する前にリストにメモリを割り当てる余分なステップを避けるため、効率的です。

+2

外部の '[]'大括弧は必要ありません - ジェネレータでも 'sum'を呼び出すことができ、すべてのスコアを含む一時的なリストの作成を避けることができます。 – sebastian

+0

ありがとう、良いキャッチ。私はあなたがそれらを省略することはできませんので、私はこれを続けているジュリアに慣れています:私はあなたのコメントで更新されます。 :) –

0

NumPyは、数値配列処理のためのライブラリです。数値を列名として使用し、コレクションを行列に変換し、正確にNumPyとそのパフォーマンスを使用する場合は、NumPyを使用して計算を行います。

私はあなたがpandasライブラリを試してみることをお勧め:それは列と行とのあなた(MatLabR言語やテーブルのデータフレームのような)—テーブルのようなコレクションが含まれており、プロセスのために作成されたタイプDataFrameを持っています。あなたの問題を解決する方法はsumです。

あなたのデータでやりたいことだけではなく、速度が重要だと思います。—このライブラリを使用することをお勧めします。あなたのライブラリーのいくつかの能力が表示されます。ここにStackOverflowの質問に関連している

、:

2
In [1963]: ll=[{ 
    ...: 'name': 'John', 
    ...: 'score': 30 
    ...: }, { 
    ... 
    ...: }] 

まず明白な反復解法を

In [1965]: sum([d['score'] for d in ll]) 
Out[1965]: 87 

私はオブジェクト配列にそれを回すことができます。

In [1966]: np.array(ll) 
Out[1966]: 
array([{'score': 30, 'name': 'John'}, {'score': 23, 'name': 'Jan'}, 
     {'score': 34, 'name': 'Mike'}], dtype=object) 

それに直接sumを適用することは助けにはなりません。しかし:

In [1967]: from operator import itemgetter 
In [1970]: np.frompyfunc(itemgetter('score'),1,1)(ll).sum() 
Out[1970]: 87 

は、配列内のオブジェクトの属性にアクセスする方法の詳細については私の最近の答え https://stackoverflow.com/a/38936480/901925を参照してください。

frompyfunc実際には反復を取り除くわけではありません。ユーザーフレンドリーな方法でラップするだけです。 itemgetterはまだリスト内の各辞書に対してitem['score']を実行しています。

itemgetterのこの使用は、基本的には同じです:

In [1974]: list(map(itemgetter('score'), ll)) 
Out[1974]: [30, 23, 34] 

リスト内包、マップ、frompyfuncは、リストを反復処理し、各辞書からscore値を得るためのすべての方法です。

pandasは、このリスト全体をデータフレームにすることができますが、その使いやすさに惑わされることはありません。すべてのことをカバーしています。私の場合は、辞書のリストである

1
lst = [{ 
    'name': 'John', 
    'score': 30 
}, { 
    'name': 'Jan', 
    'score': 23 
}, { 
    'name': 'Mike', 
    'score': 34 
}] 

sum(map(lambda x: x['score'], lst)) 
関連する問題