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

时间:2016-08-17 15:26:13

标签: python dictionary

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

我们给出了一个嵌套字典,其中在外部字典中,提到了匹配的名称,匹配的值是另一个字典,分别是它的键和值,函数的名称是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))

4 个答案:

答案 0 :(得分:3)

这是一个略微修改过的答案,取自 mine 之前的答案。

   this.list = new JList<>(listContentC);

示例输出:

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现在只是<{1}}中键/值商店的元组,而不是嵌套词典。 value只是映射到匹配键的值。那么如何将d放在键列表中 - &gt; d[key]您的value条件永远不会评估为d.keys()。尽管如此,在仅两次迭代之后,您最终会将整个迭代短路转换为if语句。哪个都没有返回正确的播放器(true 是嵌套字典),而max采用可迭代的参数,而不是int。

您应该了解有关基本控制流程,数据结构和算法设计的更多信息。我建议使用Google优秀的 python series

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

答案 2 :(得分: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))

答案 3 :(得分: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)