为了账号安全,请及时绑定邮箱和手机立即绑定

从python中的2个不同词典中获取分数的平均值

从python中的2个不同词典中获取分数的平均值

烙印99 2021-12-17 16:23:02
我有一个 Python3 代码,它返回 2 个字典(都具有相同的索引),第一个字典包含名称列表,第二个包含列表分数。对于每个索引,列表可能包含重复的名称,也可能包含不同的名称,如下面的代码所示。我如何获得字典的每个索引,列表中每个人的平均值我尝试对索引进行嵌套 for 循环以提取每个索引的列表然后我在名称列表中的每个项目上循环,保存名称的索引,然后重新循环分数以获得平均值names = {"0":['name1', 'name1', 'name2', 'name1'] , "1":['name1', 'name2', 'name2', 'name2', 'name2']}scores = {"0":[0.5, 0.5, 1, 0.2], "1":[0.2, 0.8, 0.8, 0.9, 0.9]}for ind in names:    namelist = names[ind]    scoreist = scores[ind]     #as ind in names is the same as in scores...    indices = list()    counter = 0    tempname = namelist[0]    for name in names:        if name == tempname:            indices.append(counter)        counter += 1    total = 0    for index in indicies:    total += scorlist[index]    average = total / scorelist...然后我弹出列表的索引并重新迭代。我知道应该有一种更快、更干净的方法来做到这一点,而不是在 while 循环中嵌套 for 循环......编辑:输出应该是这样的{"0": [['name1',0.3], ['name2', 0.25]], "1":[['name1', 0.05], ['name2', 0.68]]}
查看完整描述

3 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我认为你需要:


res = {}

for k,v in names.items():

    merged = [[i,j] for i,j in zip(names[k],scores[k])]

    # [['name1', 0.5], ['name1', 0.5], ['name2', 1], ['name1', 0.2]]                                                                        

    # [['name1', 0.2], ['name2', 0.8], ['name2', 0.8], ['name2', 0.9], ['name2', 0.9]]   

    s = []

    for i in set(names[k]):

        temp = sum([x[1] for x in merged if x[0]==i])/len(names[k])

        s.append([i, temp])


    res[k] = s


print(res)

输出:


{'1': [['name1', 0.04], ['name2', 0.6799999999999999]], 

 '0': [['name1', 0.3], ['name2', 0.25]]} 

解释


merged使用来自两者的值创建一个 2D 列表dict

查找唯一名称并对其进行迭代以找到平均值。


查看完整回答
反对 回复 2021-12-17
?
慕标5832272

TA贡献1966条经验 获得超4个赞

如果更干净的代码是一个重要的考虑因素,我会建议这个解决方案。虽然它可能有更糟糕的运行时间复杂度,但对于小输入大小应该无关紧要(甚至可能比朴素的 Python 循环更有效?)。


from collections import defaultdict


names = {"0":['name1', 'name1', 'name2', 'name1'] , "1":['name1', 'name2', 'name2', 'name2', 'name2']}

scores = {"0":[0.5, 0.5, 1, 0.2], "1":[0.2, 0.8, 0.8, 0.9, 0.9]}



result_dict = {}

for k,v in names.items():

    result_dict[k] = defaultdict(int)

    list_len = len(names[k])


    #  merge two lists of same key, and sort by name

    names_and_scores = sorted(zip(names[k], scores[k]), key = lambda x:x[0])


    #  sum tuples with same first element

    for key_tuple, val_tuple in names_and_scores:

        result_dict[k][key_tuple] += val_tuple / list_len


print(result_dict)


查看完整回答
反对 回复 2021-12-17
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

这为您提供了一个字典,其中包含每个名称的分数列表以及该列表的元素总数


numbers_dict = {}

for idx_1, name_list in names.items():

    values_dict = {}

    for idx_2,name in enumerate(name_list):

        if name in values_dict.keys():

            values_dict[name].append(scores[idx_1][idx_2])

        else:

            values_dict[name] = [scores[idx_1][idx_2]]

    values_dict['count'] = len(name_list)

    numbers_dict[idx_1] = values_dict


{'0': {'name1': [0.5, 0.5, 0.2], 'name2': [1], 'count': 4}, '1': {'name1': [0.2], 'name2': [0.8, 0.8, 0.9, 0.9], 'count': 5}}

然后你可以用它来计算你的平均值


avg_dict = {}

for idx, name_dict in numbers_dict.items():

    num_items = name_dict['count']

    dct = {}

    for name, numbers in name_dict.items():

        if name != 'count':

            dct[name] = sum(numbers)/num_items

    avg_dict[idx] = dct

print(avg_dict)

{'0': {'name1': 0.3, 'name2': 0.25}, '1': {'name1': 0.04, 'name2': 0.6799999999999999}}


查看完整回答
反对 回复 2021-12-17
  • 3 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号