3 回答

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
查找唯一名称并对其进行迭代以找到平均值。

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)

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}}
添加回答
举报