我不习惯使用Python编写代码,但我必须使用它来编写代码。我想要做的是,会重现SQL语句的结果,如下所示:
SELECT T2.item, AVG(T1.Value) AS MEAN FROM TABLE_DATA T1 INNER JOIN TABLE_ITEMS T2 ON T1.ptid = T2.ptid GROUP BY T2.item.
在Python中,我有两个字典列表,共有密钥'ptid'。我的dctData包含大约10万个pdit和大约7000个dctItems。使用像[i for i in dctData for j in dctItems if i['ptid'] == j['ptid']]
这样的比较器是无止境的:
ptid = 1
for line in lines[6:]: # Skipping header
data = line.split()
for d in data:
dctData.append({'ptid' : ptid, 'Value': float(d)})
ptid += 1
dctData = [{'ptid':1,'Value': 0}, {'ptid':2,'Value': 2}, {'ptid':3,'Value': 2}, {'ptid':4,'Value': 5}, {'ptid':5,'Value': 3}, {'ptid':6,'Value': 2}]
for line in lines[1:]: # Skipping header
data = line.split(';')
dctItems.append({'ptid' : int(data[1]), 'item' : data[3]})
dctItems = [{'item':21, 'ptid':1}, {'item':21, 'ptid':2}, {'item':21, 'ptid':6}, {'item':22, 'ptid':2}, {'item':22, 'ptid':5}, {'item':23, 'ptid':4}]
现在,我想得到的结果是第三个列表,它将根据dctItems dictionnary中的每个项目显示平均值,而两个词典之间的链接将基于'pdit'值。
例如,对于项目21,它将通过获取ptid 1,2和6的值(0, 2, 2)
来计算1.3的平均值:
最后,结果看起来像这样,其中键值代表计算的平均值:
dctResults = [{'id':21, 'Value':1.3}, {'id':22, 'Value':2.5}, {'id':23, 'Value':5}]
我怎样才能做到这一点?
谢谢大家的帮助。
答案 0 :(得分:0)
鉴于您使用的这些数据结构,这并非易事,但如果您使用单个字典将项目映射到其值,它将变得更容易
。首先,让我们尝试以这种方式重新构建数据:
values = {entry['ptid']: entry['Value'] for entry in dctData}
items = {}
for item in dctItems:
items.setdefault(item['item'], []).append(values[item['ptid']])
现在,items
的格式为{21: [0, 2, 2], 22: [2, 3], 23: [5]}
。当然,如果你能够首先以这种形式创建字典,那就更好了。
现在,我们可以非常轻松地计算所有这些值列表的平均值:
avg = lambda lst: float(sum(lst))/len(lst)
result = {item: avg(values) for item, values in items.items()}
这样,result
为{21: 1.3333333333333333, 22: 2.5, 23: 5.0}
或者如果你更喜欢你的词典列表"式:
dctResult = [{'id': item, 'Value': avg(values)} for item, values in items.items()]