Python 在嵌套字典的值中查找值的总和

Python 在嵌套字典的值中查找值的总和,python,dictionary,Python,Dictionary,这是一个基于嵌套字典的问题 我们得到了一个嵌套字典,其中在外部字典中,提到了匹配项的名称,匹配项的值是另一个字典,分别带有键和值,函数名是orangecap(d),它接受以下格式的字典 这是样品 d = {'match1':{'player1':57, 'player2':38}, 'match2':{'player3':9, 'player1':42}, 'match3':{'player2':41, 'player4':63, 'player3':91}} 所以我想通过player键进行搜

这是一个基于嵌套字典的问题

我们得到了一个嵌套字典,其中在外部字典中,提到了匹配项的名称,匹配项的值是另一个字典,分别带有键和值,函数名是
orangecap(d)
,它接受以下格式的字典

这是样品

d = {'match1':{'player1':57, 'player2':38}, 'match2':{'player3':9, 'player1':42}, 'match3':{'player2':41, 'player4':63, 'player3':91}}
所以我想通过player键进行搜索,计算每个player的总和,并返回最大的总和

因此,输出需要是
('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))

像这样的方法应该会奏效:

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
)。然后,它使用分数对字典中的项目进行排序,并返回最高值。

下面是一个可能的解决方案:

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

这是从先前的答案中略作修改的答案

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
循环遍历最内部的结构(迭代
值,而不是
d
),而是再次遍历
d

value
现在只是存储在
d
中的键/值的元组,而不是嵌套字典
d[key]
只是映射到匹配键的值。那么,如果
条件的计算结果从未达到
true
,那么
值怎么可能出现在键列表中->
d.keys()
您的
。尽管如此,在两次迭代之后,您将整个迭代短路到
return
语句。它既不返回正确的播放机(
d[key]
是嵌套的字典),也不接受iterable参数,而不是int


您应该了解有关基本控制流、数据结构和算法设计的更多信息。我认为谷歌很优秀。

因为必须有人来做。。。这是一条单行线

编辑:不再是一句台词,因为我意识到球员也应该被归还。现在它是一个函数中的一行

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)

您能告诉我我的代码哪里出了问题吗?@DhruvMarwha,如果您认为我已经回答了您的问题,请随意标记为已回答。您可以使用
defaultdict(int)
将默认值设置为0,而不是lambda:)