您好,我有一个使用lambda和python中的map对一行中的所有数字求和的助手

您好,我有一个使用lambda和python中的map对一行中的所有数字求和的助手,python,error-handling,iteration,Python,Error Handling,Iteration,此外,我不能同时将int转换为string,也不能使用列表理解 我不断地遇到同样的错误,我不知道如何处理它 代码如下: sum_of_digits = lambda a: map(lambda b, c: b + sum_of_digits(c) if a > 10 else None, a % 10, a / 10) if a > 10 else None def main(): print(sum_of_digits(104)) if __name__ == '__m

此外,我不能同时将int转换为string,也不能使用列表理解

我不断地遇到同样的错误,我不知道如何处理它

代码如下:

sum_of_digits = lambda a: map(lambda b, c: b + sum_of_digits(c) if a > 10 else None, a % 10, a / 10) if a > 10 else None

def main():
    print(sum_of_digits(104))

if __name__ == '__main__':
    main()
这就是错误:

TypeError: argument 2 to map() must support iteration

Map接受一个函数并将其应用于某个可移植的对象。你没有给它一个可移植的东西,只是一个函数

试试这样的

import math

sum_of_digits = lambda x: sum([int(c) for c in str(x)])

the_value_of_a_specific_digit = lambda x, d: int(x / 10 ** d % 10)
an_iterable_of_number_of_digits = lambda x: range(int(math.log(x, 10))+1)
a_combined_function = lambda x: sum(map(func, iterable))

def main():
    print(sum_of_digits(104))

if __name__ == '__main__':
    main()

此答案适用于问题的先前版本,但不符合新编辑版本的要求

正如其他人指出的,错误的原因是map函数的第二个参数是一个整数,即%10,但它应该是一个iterable

下面是一个满足您的问题需求的单行程序:它创建一个函数,返回非负整数的位数之和,并使用lambda和map。它还使用int和str,但这并不违背您声明的要求。这是因为stra返回一个字符串,该字符串是数字的一个可数位数。每个数字都是一个1字符的字符串,在求和之前必须将其转换为整数。地图会进行这种转换

sum_of_digits = lambda a: sum(map(int, str(a)))

有一个有趣的小递归版本,使用和:

如果n为falsy,即0,则返回n,否则返回最低有效位与n//10之和


如果您使用的是Python 2,您必须从uu future uu导入division

映射的第二个参数必须是某种序列或可计算的,以生成对象序列,映射的第一个参数中的函数将逐个应用于该序列。@vash_the_stamped好吧,它在语法上是正确的,不会抛出错误。这并不意味着它有多大意义。@MichaelButscher那么它很好我忘了告诉你我不能在int和string之间转换它,也不能把列表理解作为作业的一部分。好吧,这让它变得更难。我对答案进行了编辑,为您提供了一些关于如何处理此问题的想法。我忘了通知您,我无法将其在int和string之间转换,也无法将列表理解作为作业的一部分。@MichaelCracker:这是对您的问题的重大更改。你真的应该问一个新的,单独的问题,添加那些新的需求。我将把这个答案留作参考,但请注意,它并没有回答你问题的新版本。这是一个相当简洁的答案。以前从未见过。很好,它甚至可以在不从未来导入的情况下工作。你能试着帮我解释一下我的思路吗?我认为这更容易理解,因为数字之和=λn:n如果n<10,其他n%10+数字之和n//10。它还为非零1位数的参数少运行一次深层调用。
sum_of_digits = lambda n: n and n%10 + sum_of_digits(n//10)