【问题标题】:Am I using list comprehensions wrong?我使用列表推导错了吗?
【发布时间】:2020-06-06 14:10:59
【问题描述】:

所以我的 Python 代码在下面继续查找数字的总和 (9983 = 9+9+8+3 = 29 = 2+9 = 11 = 1+1 = 2) 不起作用,它给了我这个异常

ValueError: invalid literal for int() with base 10: '['". 

它之前没有使用列表理解,而是通过正常迭代列表来完成它,所以我怀疑这是列表理解的问题?帮忙?

x = int(input())
def rec(x):
   if (x<10):
      return x
   return rec(sum(x))
def sum(x):
   lst = [int(y) for y in list(str(x))]
   return sum(lst)
print(rec(x))

【问题讨论】:

  • 不要使用sum作为你的函数名,它是一个内置函数名,会导致问题。请注意,您创建了一个递归函数,这可能不是您想要的。更改名称以避免出现问题。
  • 正如汤姆所说,这就是问题所在:rec 应该是递归的,这很好,但 sum 也是递归的,它不应该是!
  • 永远不要使用已经存在的名称,来自你的代码或内置的(如果你知道sum 存在),如果不仅仅是一个警告,可以避免一个loooot烦恼

标签: python list sum list-comprehension


【解决方案1】:

有一个名为 sum 的内置函数,您定义了一个同名的函数 - 但您需要原始函数作为解决方案的一部分。

让我们首先将您的 sum 版本重命名为 summation,并借此机会进一步简化代码:

def rec(x):
    if x < 10:
        return x
    return rec(summation(x))

def summation(x):
    return sum(int(y) for y in str(x))

看看summation 内部是如何需要内置sum 的?这就是为什么你的函数必须有一个不同的名字!虽然我们可以使用列表推导,但将生成器表达式传递给sum 会更容易、更有效。或者(但效率较低)我们可以使用列表推导:

def summation(x):
    lst = [int(y) for y in str(x)]
    return sum(lst)

无论哪种方式,它都按预期工作:

rec(9983)
=>2

【讨论】:

    【解决方案2】:

    您正在为 Python 制造混乱 ;-)

    问题出在def sum(x):,而不是列表理解中。 sum 是保留关键字。只需重命名函数(以​​及对函数的调用)即可。

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多