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

我有一个 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]]}


烙印99
浏览 361回答 3
3回答

Cats萌萌

我认为你需要: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] = sprint(res)输出:{'1': [['name1', 0.04], ['name2', 0.6799999999999999]],  '0': [['name1', 0.3], ['name2', 0.25]]} 解释merged使用来自两者的值创建一个 2D 列表dict查找唯一名称并对其进行迭代以找到平均值。

慕标5832272

如果更干净的代码是一个重要的考虑因素,我会建议这个解决方案。虽然它可能有更糟糕的运行时间复杂度,但对于小输入大小应该无关紧要(甚至可能比朴素的 Python 循环更有效?)。from collections import defaultdictnames = {"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_lenprint(result_dict)

肥皂起泡泡

这为您提供了一个字典,其中包含每个名称的分数列表以及该列表的元素总数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] = dctprint(avg_dict){'0': {'name1': 0.3, 'name2': 0.25}, '1': {'name1': 0.04, 'name2': 0.6799999999999999}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python