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