2016-08-17 72 views
2

這是一個基於嵌套的字典的問題。查找嵌套字典值的總和值

我們給出了一個嵌套字典,其中在外部字典中提到了匹配的名稱,匹配的值是分別帶有鍵和值的另一個字典,函數的名稱是orangecap(d),它接受字典採用以下格式。

下面是示例。

d = {'match1':{'player1':57, 'player2':38}, 'match2':{'player3':9, 'player1':42}, 'match3':{'player2':41, 'player4':63, 'player3':91}} 

所以我想按玩家鍵搜索並計算每個玩家的總和並返回最大的總和。

所以輸出必須('player3', 100)

這是我到目前爲止已經試過,但無濟於事:

def orangecap(d): 
    total=0 
    for key,value in d.items(): 
     for value in d.items(): 
      if d[key] in d.keys(): 
       total = total+d[value] 
      return(d[key],max(total)) 

回答

1

像這樣的東西應該工作:

def orangecap(d): 
    players = {} 
    for match, scores in d.iteritems(): 
     for player, score in scores.iteritems(): 
      if player not in players: 
       players[player] = score 
      else: 
       players[player] += score 
    return sorted(players.items(), key=lambda x: x[1])[-1] 

這將創建包含玩家總分的字典(players)。然後使用分數對字典中的項目進行排序並返回最高值。

0

這裏是一個可能的解決方案:

from collections import defaultdict 

data = { 
    'match1': {'player1': 57, 'player2': 38}, 
    'match2': {'player3': 9, 'player1': 42}, 
    'match3': {'player2': 41, 'player4': 63, 'player3': 91} 
} 


def orangecap(d): 
    result = defaultdict(int) 
    for k, v in data.items(): 
     for k1, v1 in v.items(): 
      result[k1] += v1 

    return sorted(result.items(), key=lambda x: x[1])[-1] 

print(orangecap(data)) 
+0

你可以用'defaultdict(INT)'有0而不是拉姆達:) – Karin

+0

@Karin哦默認情況下,這很酷,你是對的,THX! – BPL

3

這是從mine一個以前答案採取了略微修改的答案。

def find_totals(d): 
    total = {} 
    for match, results in d.items(): 
     for player, score in results.items(): 
      total[player] = total.get(player, 0) + score 
    highest_score = max(total, key=total.get) 
    return highest_score, total[highest_score] 

輸出示例:

>>> d = {'match1':{'player1':57, 'player2':38}, 'match2':{'player3':9, 'player1':42}, 'match3':{'player2':41, 'player4':63, 'player3':91}} 
>>> print find_totals(d) 
('player3', 100) 

所以,這是怎麼回事你的代碼?讓我們來看看算法:

首先,您可以通過項目迭代(鍵/值)的d。這很好,因爲你試圖遍歷一個嵌套的字典結構。然而代替使用第二for環路(迭代過value,代替d)穿過最內部結構,則代替再次遍歷d

value現在處於d鍵/值存儲的僅僅是一個元組,而不是嵌套字典。 d[key]只是映射到匹配鍵的值。那麼如何才能value在密鑰列表中 - >d.keys()您的if條件永遠不會計算爲true。儘管如此,在兩個迭代之後,您最終將短路整個迭代到return語句。哪一個都不會返回正確的播放器(d[key]是嵌套字典),並且max需要可迭代的參數,而不是int。

您應該瞭解有關基本控制流,數據結構和算法設計的更多信息。我會建議谷歌的優秀python series

+0

你能告訴我我在哪裏做錯了我的代碼? –

+0

當然,我會盡快更新我的答案@Druk Marwha – ospahiu

+0

@DrukMarwha,如果您認爲我已經回答了您的問題,請隨時標記爲已回答。 – ospahiu

0

因爲有人不得不這樣做...這是一個單線程。

編輯:不再是一個班輪,因爲我意識到球員也是爲了回報。所以它現在是一個函數中的單線程。

def total_score(*, match_results: dict, player_name: str): 
    return player_name, sum(score for player_scores in match_results.values() 
            for player, score in player_scores.items() 
            if player == player_name)