亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從python中的2個不同詞典中獲取分數的平均值

從python中的2個不同詞典中獲取分數的平均值

烙印99 2021-12-17 16:23:02
我有一個 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]]}
查看完整描述

3 回答

?
Cats萌萌

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

查找唯一名稱并對其進行迭代以找到平均值。


查看完整回答
反對 回復 2021-12-17
?
慕標5832272

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)


查看完整回答
反對 回復 2021-12-17
?
肥皂起泡泡

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


查看完整回答
反對 回復 2021-12-17
  • 3 回答
  • 0 關注
  • 307 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號