2

我是 Python 新手,我从数据库中获得了这种结构

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 集构建一个新的字典,但是 ID 的数量会增加,我不知道如何解决这个问题。如果有人能给我一些想法,我将不胜感激。

4

4 回答 4

3

假设您的数据按 ID 排序,因为它出现在data变量中,您可以尝试使用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

更新:在帝斯曼发表评论后。)

您可以像这样重塑数据:

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 列表:

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

从那里你可以计算任何你想要的。

于 2012-12-27T22:56:42.797 回答