2016-08-17 164 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)