链接两个词典列表并计算平均值

时间:2015-02-05 20:32:16

标签: python list join mean

我不习惯使用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}]

我怎样才能做到这一点?

谢谢大家的帮助。

1 个答案:

答案 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()]