stats1
函数接受一个dict
参数并返回3元组列表,其中包含一个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))
如何修复代码?你知道吗
您还可以使用列表理解:
平均值的算法不正确,需要执行以下操作:
输出:
但更明确的答案是(根据ggorlen's comment编辑):
输出:
你说得对,我喜欢
defaultdict
方法。如果将平均步骤与聚合步骤分离,您可能会发现该逻辑更易于管理。你知道吗中间dict应该包含每个映射到服务级别列表的提供者名称键。循环dict中的每个人,并取他们服务的平均值来构建结果元组。所提供的服务的数量隐含着列表的长度。你知道吗
对元组的排序有很好的定义(默认情况下,它们将在第一个元素上排序),因此不需要指定
key
。你知道吗相关问题 更多 >
编程相关推荐