2

私はPythonを初めて使用し、この構造をDBから実現しています。

data=[
{'Value': '0.2', 'id': 1},
{'Value': '1.2', 'id': 1},
{'Value': '33.34', 'id': 2},
{'Value': '44.3', 'id': 3},
{'Value': '33.23', 'id': 3},
{'Value': '21.1', 'id': 4},
{'Value': '5.33', 'id': 4},
{'Value': '33.3', 'id': 5},
{'Value': '12.2', 'id': 5},
{'Value': '1.22', 'id': 5},
{'Value': '1.23', 'id': 6}
]

次のコマンドでレコードのIDを取得できることを知っています。

data[i]['id']

ただし、すべてのIDの平均値を取得するには、適切なデータ構造でIDごとに収集する必要があります。

これのためのより良い選択は何ですか?

IDセットごとに新しいdictを作成することを考えていますが、IDの数が増える可能性があり、この問題にどのように取り組むかがわかりません。誰かが私にいくつかのアイデアを与えることができれば、私は非常に感謝するでしょう。

4

4 に答える 4

3

dataデータが変数に表示されるIDで並べ替えられていると仮定すると、を使用して試すことができます。itertools.groupbyこれは、でグループ化するように指示できますid。次に、 :idに等しい数値と値に等しいキーを持つ新しい辞書を作成できます。means

In [1]: from itertools import groupby

In [2]: data=[
   ...: {'Value': '0.2', 'id': 1},
   ...: {'Value': '1.2', 'id': 1},
   ...: {'Value': '33.34', 'id': 2},
   ...: {'Value': '44.3', 'id': 3},
   ...: {'Value': '33.23', 'id': 3},
   ...: {'Value': '21.1', 'id': 4},
   ...: {'Value': '5.33', 'id': 4},
   ...: {'Value': '33.3', 'id': 5},
   ...: {'Value': '12.2', 'id': 5},
   ...: {'Value': '1.22', 'id': 5},
   ...: {'Value': '1.23', 'id': 6}
   ...: ]

In [3]: means = {}

In [4]: for k, g in groupby(data, key=lambda x: x['id']):
   ...:     g = list(g)
   ...:     means[k] = sum(float(x['Value']) for x in g) / len(g)
   ...:     
   ...:     

In [5]: means
Out[5]: 
{1: 0.69999999999999996,
 2: 33.340000000000003,
 3: 38.765000000000001,
 4: 13.215,
 5: 15.573333333333332,
 6: 1.23}
于 2012-12-27T23:03:14.883 に答える
2

更新: DSMのコメントの後。)

次のようにデータの形状を変更できます。

from collections import defaultdict

data=[
{'Value': '0.2', 'id': 1},
{'Value': '1.2', 'id': 1},
{'Value': '33.34', 'id': 2},
{'Value': '44.3', 'id': 3},
{'Value': '33.23', 'id': 3},
{'Value': '21.1', 'id': 4},
{'Value': '5.33', 'id': 4},
{'Value': '33.3', 'id': 5},
{'Value': '12.2', 'id': 5},
{'Value': '1.22', 'id': 5},
{'Value': '1.23', 'id': 6}
]

newdata = defaultdict(list)
for r in data:
    newdata[r['id']].append(float(r['Value']))

これにより、次のようになります。

In [2]: newdata
Out[2]: defaultdict(<type 'list'>, {1: [0.2, 1.2], 2: [33.34], 3: [44.3, 33.23], 4: [21.1, 5.33], 5: [33.3, 12.2, 1.22], 6: [1.23]})

アップデート2)

平均の計算は、辞書を理解することで簡単になりました。

mean = {id: sum(values) / len(values) for id, values in newdata.viewitems()}

これは次のようになります。

In [4]: mean
Out[4]: {1: 0.7, 2: 33.34, 3: 38.765, 4: 13.215, 5: 15.573333333333332, 6: 1.23}
于 2012-12-27T23:08:01.810 に答える
0

あなたが持っているならnumpy、あなたはこれのためにそれを簡単に使うことができます:

import numpy
numpy.mean([x['id'] for x in data])

それ以外の場合は、次のように簡単になります。

from __future__ import division # if python2.7
ids = [x['id'] for x in data]
print sum(ids)/len(ids)
于 2012-12-27T22:54:49.813 に答える
0

すべてが収集された後、IDのリストを作成するだけです。

id_list = [element['id'] for element in data]

そこから、好きなように計算できます。

于 2012-12-27T22:56:42.797 に答える