获取python中两个不同词典的平均分数

获取python中两个不同词典的平均分数,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有一个Python3代码,它返回两个字典(都有相同的索引)。第一个字典包含名称列表,第二个包含列表分数 对于每个索引,列表可能包含重复的名称,并且可能包含不同的名称,如下面的代码所示 我怎样才能得到字典的每个索引,列表中每个人的平均值 我尝试在索引上执行嵌套for循环,以提取每个索引上的列表 然后,我循环名称列表中的每个项目,保存名称的索引,然后重新循环分数以获得平均值 names={“0”:['name1','name1','name2','name1'],“1”:['name1','nam

我有一个Python3代码,它返回两个字典(都有相同的索引)。第一个字典包含名称列表,第二个包含列表分数

对于每个索引,列表可能包含重复的名称,并且可能包含不同的名称,如下面的代码所示

我怎样才能得到字典的每个索引,列表中每个人的平均值

我尝试在索引上执行嵌套for循环,以提取每个索引上的列表

然后,我循环名称列表中的每个项目,保存名称的索引,然后重新循环分数以获得平均值

names={“0”:['name1','name1','name2','name1'],“1”:['name1','name2','name2','name2']}
分数={“0”:[0.5,0.5,1,0.2],“1”:[0.2,0.8,0.8,0.9,0.9]}
对于名称中的ind:
名称列表=名称[ind]
记分员=分数[ind]#因为名字中的ind与分数中的ind相同
.
.
.
索引=列表()
计数器=0
tempname=namelist[0]
对于名称中的名称:
如果name==tempname:
索引。追加(计数器)
计数器+=1
总数=0
对于指标中的索引:
总计+=索引列表[索引]
平均值=总数/得分表
.
.
.
然后我弹出列表的索引并重新迭代。 我知道应该有一种更快、更干净的方法来实现这一点,而不是在while循环中嵌套循环

编辑:

输出应该类似于

{"0": [['name1',0.3], ['name2', 0.25]], "1":[['name1', 0.05], ['name2', 0.68]]}
我认为你需要:

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]]} 
解释

  • 创建一个二维列表
    合并
    ,其中包含来自两个
    目录的值
  • 找到唯一的名称,然后在上面创建以找到平均值

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

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}}

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


你能提供一个预期的输出吗?另外,您的代码有很多语法错误。请重新检查代码的语法正确性并粘贴它again@DeveshKumarSingh我加上了预期的结果。不需要完全相同的方法,但我需要得到每个索引的每个名称的平均值。名称1在“1”中的平均分数不是0.05而是0.04吗?
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)