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}}
添加回答
舉報