【问题标题】:Find the sum of values within the values of a nested Dictionary在嵌套字典的值中查找值的总和
【发布时间】:2016-08-17 15:26:12
【问题描述】:

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

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

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    这是从 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 现在只是dkey/value 存储的元组,而不是嵌套字典。 d[key] 只是映射到匹配键的值。那么value 怎么会出现在键列表中-> d.keys() 你的if 条件永远不会评估为true。尽管如此,您最终短路整个迭代到return 语句仅在两次 迭代之后。哪个都不返回正确的播放器(d[key] 是嵌套字典),max 采用可迭代参数,而不是 int。

    您应该了解有关基本控制流、数据结构和算法设计的更多信息。我会推荐 Google 的优秀python series

    【讨论】:

    • 你能告诉我我的代码哪里做错了吗?
    • @DhruvMarwha,如果您认为我已经回答了您的问题,请随时标记为已回答。
    【解决方案2】:

    这样的事情应该可以工作:

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

    【讨论】:

      【解决方案3】:

      因为有人必须这样做......这是一个单线。

      编辑:不再是一个班轮,因为我意识到玩家也应该被归还。所以它现在是函数中的单行代码。

      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)
      

      【讨论】:

        【解决方案4】:

        这是一个可能的解决方案:

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

        【讨论】:

        • 您可以使用 defaultdict(int) 来设置默认值 0 而不是 lambda :)
        猜你喜欢
        • 2013-07-01
        • 1970-01-01
        • 2022-10-12
        • 2013-10-23
        • 2022-06-15
        • 2019-04-16
        • 2021-02-05
        • 2013-08-04
        • 1970-01-01
        相关资源
        最近更新 更多