Python,从一系列dicts中收集数据

时间:2012-12-27 22:52:52

标签: python

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

4 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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}

答案 2 :(得分: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)

答案 3 :(得分:0)

您可以在收集完ID后简单地创建ID列表:

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

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