python递归类型错误

2024-04-24 13:46:57 发布

您现在位置:Python中文网/ 问答频道 /正文

如果有人能告诉我为什么sum\u all([1,[2,[3,[4]]])不起作用,我将不胜感激?它说它只能将list(而不是“int”)连接到list,但是如果我的代码按我认为应该的方式工作,那就不应该发生。顺便说一句,我的代码使用递归对列表中的所有元素求和,而不管它们是整数还是其他列表

def rec_sum(numbers):
    lnum = len(numbers)
    if lnum == 0:
        return 0
    elif lnum == 1:
        return numbers[0]
    else:
        numbers[0] = numbers[-1] + numbers[0]
        del numbers[-1]
        return rec_sum(numbers)

def sum_all(numbers):
    lnum = len(numbers)
    if lnum == 0:
        return 0
    elif lnum == 1:
        if isinstance(numbers[0], int):
            return numbers[0]
        elif isinstance(numbers[0], list):
            return rec_sum(numbers[0])
    else:
        if isinstance(numbers[-1], list) and isinstance(numbers[0], list):
            numbers[0] = rec_sum(numbers[0]) + rec_sum(numbers[-1])
            del numbers[-1]
            return sum_all(numbers)
        elif isinstance(numbers[-1], list) and isinstance(numbers[0], int):
            numbers[0] = numbers[0] + rec_sum(numbers[-1])
            del numbers[-1]
            return sum_all(numbers)
        elif isinstance(numbers[-1], int) and isinstance(numbers[0], list):
            numbers[0] = rec_sum(numbers[0]) + numbers[-1]
            del numbers[-1]
            return sum_all(numbers)
        elif isinstance(numbers[-1], int) and isinstance(numbers[0], int):
            numbers[0] = numbers[0] + numbers[-1]
            del numbers[-1]
            return sum_all(numbers)

回溯(最近一次呼叫):

File "<pyshell#8>", line 1, in <module> sum_all([1, [2, [3, [4]]]])
 File "C:/Users/#/Documents/python/recursion.py", line 36, in sum_all numbers[0] = numbers[0] + rec_sum(numbers[-1])
  File "C:/Users/#/Documents/python/recursion.py", line 17, in rec_sum numbers[0] = numbers[-1] + numbers[0]
   TypeError: can only concatenate list (not "int") to list

Tags: andreturniflinealllistfileint
2条回答

非常简单地考虑一下当嵌套输入出现在代码中时会发生什么。在代码中:

if isinstance(numbers[-1], list) and isinstance(numbers[0], list):

我们可以说这一标准确实得到了满足。然后你就有了:

numbers[0] = rec_sum(numbers[0]) + rec_sum(numbers[-1])

我们知道numbers[-1]是一个列表,但我们不知道它是否是一个平面列表。在rec_sum(numbers[-1])中有一行:

numbers[0] = numbers[-1] + numbers[0]

因为数字是嵌套的,所以数字中的一个元素可以是列表,而另一个元素可以是整数。尝试添加它们会抛出一个错误

你试图处理这个问题是错误的。这样想:

  1. 尝试将输入中的所有元素添加到一起
  2. 如果遇到一个列表,请将其替换为其所有元素的总和
  3. 重复步骤1和2,直到不再有嵌套列表

下面是一个应用上述逻辑的简洁的一行代码:

def sum_all(l): return sum([i if isinstance(i, int) else sum_all(i) for i in l])

你根本不需要rec_sum。递归的思想是,每个子列表都以与当前列表相同的方式处理,并且rec\u sum没有与主函数sum_all相同的逻辑来区分列表和数字,因为它将每个项目都视为一个数字,所以当它尝试添加项目但其中一个是列表时,由于无法“添加”(或将列表与数字串联)而引发异常

相反,只需删除rec_sum,并用sum_all替换所有对rec_sum的调用,代码就很好了

def sum_all(numbers):
    lnum = len(numbers)
    if lnum == 0:
        return 0
    elif lnum == 1:
        if isinstance(numbers[0], int):
            return numbers[0]
        elif isinstance(numbers[0], list):
            return rec_sum(numbers[0])
    else:
        if isinstance(numbers[-1], list) and isinstance(numbers[0], list):
            numbers[0] = sum_all(numbers[0]) + sum_all(numbers[-1])
            del numbers[-1]
            return sum_all(numbers)
        elif isinstance(numbers[-1], list) and isinstance(numbers[0], int):
            numbers[0] = numbers[0] + sum_all(numbers[-1])
            del numbers[-1]
            return sum_all(numbers)
        elif isinstance(numbers[-1], int) and isinstance(numbers[0], list):
            numbers[0] = sum_all(numbers[0]) + numbers[-1]
            del numbers[-1]
            return sum_all(numbers)
        elif isinstance(numbers[-1], int) and isinstance(numbers[0], int):
            numbers[0] = numbers[0] + numbers[-1]
            del numbers[-1]
            return sum_all(numbers)

print(sum_all([[4,5],1,4,5,[3,[1],5]]))的输出:(用于引发异常)

28

相关问题 更多 >