聚合字典结构中的数据以返回3个具有平均值的元组的列表

问题描述 投票:1回答:3

stats1函数接受一个dict参数,并返回一个三元组列表,其中包含str(提供者),int(他/她提供的服务数量)和float (平均专业水平)。结果必须按提供者的名称排序。调用stats1(db1)返回:

[('Al', 2, 1.5), ('Bob', 2, 2.0), ('Carol', 3, 1.3333333333333333)]

请注意,Al提供2项服务,其平均专业水平为1.5((狗在2级,绘画在1级)。>>

db1 = {
    ('Al', 'dog-walking'): 2,
    ('Al', 'painting'): 1,
    ('Bob', 'dog-walking'): 1,
    ('Bob', 'knife-sharpening'): 3,
    ('Carol', 'cleanup'): 1,
    ('Carol', 'dog-walking'): 2,
    ('Carol', 'painting'): 1
}

我没有在解决方案中添加正确的值,并且无法对其进行排序。

到目前为止我所拥有的:

def stats(db1):
    d=defaultdict(lambda:[0,0])
    z=1
    for nametuple, expertlevel in db1.items():
        d[nametuple[0]][0]+=1
        if  d[nametuple[0]][1]==0:
            d[nametuple[0]][1]+=expertlevel
        else:
            d[nametuple[0]][1]+=expertlevel/z
            z+=1
    #return d
    return sorted(d.items(),key=lambda x: (-[x][0],x[1],d))
print(stats(db1))

如何修复我的代码?

stats1函数接受一个dict参数,并返回一个三元组的列表,其中包含一个str(一个提供程序),一个int(他/她提供的服务数量)和一个float(平均专业知识水平)。 ...

python dictionary
3个回答
2
投票

您处在正确的轨道上,我喜欢defaultdict方法。如果将平均步骤与聚合步骤分离,则可能会发现逻辑更易于管理。

中间字典应包含提供程序名称键,每个提供程序名称键均映射到服务级别列表。遍历字典中的每个人,并取其平均服务来构建结果元组。提供的服务数量暗含列表的长度。


2
投票

您的均值算法不正确,您需要这样做:


0
投票

您也可以使用列表理解来做到这一点:

© www.soinside.com 2019 - 2024. All rights reserved.