【问题标题】:How to get the sum of all numbers in nested dictionaries recursively?如何递归地获取嵌套字典中所有数字的总和?
【发布时间】:2021-07-27 14:10:39
【问题描述】:

我试图递归地从嵌套字典中获取所有数字的总和,但我的代码不断向我抛出错误。我不确定我可以进行哪些其他更改来解决此问题,因此我们将不胜感激!

obj = {
    "a":2,
    "b":{"x":2, "y":{"foo":3, "z":{"bar":2}}},
    "c":{"p":{"h":2, "r":5}, "q":"ball", "r":5},
    "d":1,
    "e":{"nn":{"lil":2},"mm":"car"}}
    
def recursive_sum(n):
    current_sum = 0
    for key in n:
        if not isinstance(n[key], dict):
            current_sum = current_sum + n[key]
        else: 
            current_sum = current_sum + recursive_sum(n[key])
    return current_sum

recursive_sum(obj)

以下是我不断收到的错误消息:

TypeError                                 Traceback (most recent call last)
<ipython-input-18-04d5913ff6b1> in <module>
     15     return current_sum
     16 
---> 17 recursive_sum(obj)

<ipython-input-18-04d5913ff6b1> in recursive_sum(n)
     12             current_sum = current_sum + n[key]
     13         else:
---> 14             current_sum = current_sum + recursive_sum(n[key])
     15     return current_sum
     16 

<ipython-input-18-04d5913ff6b1> in recursive_sum(n)
     10     for key in n:
     11         if not isinstance(n[key], dict):
---> 12             current_sum = current_sum + n[key]
     13         else:
     14             current_sum = current_sum + recursive_sum(n[key])

TypeError: unsupported operand type(s) for +: 'int' and 'str'

【问题讨论】:

  • 你有"q":"ball""mm":"car";你可能想处理这些
  • 您说代码应该对嵌套字典中找到的偶数求和。用你自己的话来说,你的代码的哪一部分是为了确保你求和的东西是偶数?或者他们确实是数字?如果您在分析代码时连那么都没有,我不得不怀疑它实际上是您自己的代码。
  • @KarlKnechtel 拼写错误,我现在已经更正了。我必须对代码中的数字求和,但其中一个重要部分是区分数字和字符串,我尝试通过类型转换来处理这个问题,但没有成功。因此,我在这里寻求帮助。我的朋友,你应该尽量不要太怀疑别人

标签: python python-3.x dictionary recursion


【解决方案1】:

你必须像这样处理非整数值:

def recursive_sum(n):
    current_sum = 0
    for key in n:
        if not isinstance(n[key], dict) :
            if type(n[key]) is int:
                current_sum = current_sum + n[key]
        else:
            current_sum = current_sum + recursive_sum(n[key])
    return current_sum

【讨论】:

    【解决方案2】:

    正如 Mustafa Aydın 所说,您收到错误是因为值中有字符串。 如果它们不是错误而是您输入的一部分,那么

    def recursive_sum(n):
        current_sum = 0
        if(not isinstance(n,str)):
            for i,j in n.items():
                if(isinstance(j,int)):
                    current_sum += j
                else:
                    current_sum += recursive_sum(j)
        return current_sum
    

    应该工作

    【讨论】:

      【解决方案3】:

      正如错误所说,至少有一个实例 current_sum 是 integer 而 n[key] 是 string。而 Python 可以对这些类型进行+ 操作。

      在你的情况下,问题来自"q":"ball"

      如何找到这个?

      这是您的代码的修改版本(带有附加条件):

      obj = {
          "a":2,
          "b":{"x":2, "y":{"foo":3, "z":{"bar":2}}},
          "c":{"p":{"h":2, "r":5}, "q":"ball", "r":5},
          "d":1,
          "e":{"nn":{"lil":2},"mm":"car"}}
          
      def recursive_sum(n):
          current_sum = 0
          for key in n:
              
              if not isinstance(n[key], dict) :
                  if  not isinstance(n[key], str) :
                      current_sum = current_sum + n[key]
              else: 
                  current_sum = current_sum + recursive_sum(n[key])
          return current_sum
      
      recursive_sum(obj)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 2012-05-21
        • 2023-04-05
        • 2021-02-05
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        相关资源
        最近更新 更多