【问题标题】:Summing specific elements in nested dict对嵌套字典中的特定元素求和
【发布时间】:2019-01-28 10:31:07
【问题描述】:

我有 3 个不同的包,我使用嵌套字典表示。它们的键是“bag1”、“bag2”和“bag3”,反过来,它们包含不同数量的不同颜色的球,每个颜色类别也由一个字典表示。如何最终得到一本简单地在每个包中添加所有相应颜色的字典?例如,dict1 = {'bag1': { 'red' : 2, 'blue' : 5, 'green' : 7}, 'bag2' : { 'red' : 3, 'blue': 4, 'green': 8}}。现在,我想得到另一个形式的最终字典:dict2 = { 'red' : 5, 'blue': 9, 'green': 15}。有人可以为我提供一个功能吗?

【问题讨论】:

  • 请提供一些您尝试过的代码并提及您遇到的问题。
  • 嘿!我假设您是 stackoverflow 的新手,贡献者不能立即提供完整的代码。您必须首先告诉我们您尝试过的技术或方法以及遇到的困难,然后我们将帮助您解决它们或提供新的/有效的解决方案。但首先尝试自己解决。

标签: python function dictionary sum


【解决方案1】:

首先你要创建结果字典:

dict2 = {}
for key in dict1['bag1'].keys():
    dict2[key] = 0

然后填写

for bag in dict1.values():
    for key, value in bag.items():
        dict2[key] += value

【讨论】:

    【解决方案2】:

    您可以使用来自collections 模块的Counter

    from collections import Counter
    dict1 = {'bag1': {'red': 2, 'blue': 5, 'green': 7}, 'bag2': {'red': 3, 'blue': 4, 'green': 8}}
    
    counter = sum(map(Counter, dict1.values()), Counter())
    print dict(counter)
    

    输出

    {'blue': 9, 'green': 15, 'red': 5}
    

    【讨论】:

      【解决方案3】:

      下面的递归函数get_value将从JSON中找到键的值。

      import json
      
      def get_value(key, mydict):
          if key in mydict:
              return mydict[key]
      
          if type(mydict) is dict:
              for i in mydict:
                  if type(i) is dict:
                      return get_value(key, i)
          return 0
      
      def get_sum(dict1, dict2):
          red, blue, green = 0, 0, 0
          red = get_value('red', dict1) + get_value('red', dict2)
          blue = get_value('blue', dict1) + get_value('blue', dict2)
          green = get_value('green', dict1) + get_value('green', dict2)
          return {
              'red':red,
              'blue': blue,
              'green':green
          }
      
      if __name__=="__main__":
          dict1 = {'bag1': { 'red' : 2, 'blue' : 5, 'green' : 7}, 'bag2' : { 'red' : 3, 'blue': 4, 'green': 8}}
          dict2 = { 'red' : 5, 'blue': 9, 'green': 15}
          final_sum = get_sum(dict1, dict2)
          print(final_sum)
      

      输出:{'red': 5, 'blue': 9, 'green': 15}

      【讨论】:

        【解决方案4】:

        使用list comprehensions 解决这个问题 -

        a=[ d.items() for d in list(dict1.values())]
        my_tuples=[item for sublist in a for item in sublist]
        my_set = {x[0] for x in my_tuples}
        my_sums = dict([(i,sum(x[1] for x in my_tuples if x[0] == i)) for i in my_set])
        print(my_sums)
            {'green': 15, 'red': 5, 'blue': 9}
        

        【讨论】:

        • str 对象在第 4 行不可调用。
        • 我已经测试过了,它工作正常。我的python版本是3.6.2
        猜你喜欢
        • 2016-09-17
        • 2015-01-28
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 2018-11-22
        相关资源
        最近更新 更多