我是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的数量会增加,我不知道如何解决这个问题。如果有人能给我一些想法,我将非常感激。
答案 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]
从那里你可以计算你想要的任何东西。