我需要编写一个函数 nested_sum(L),它将对列表中的所有整数求和,无论它们是否在另一个列表中。这与再次调用另一个函数 mult2(n)。
示例:
>>> nestedSum(mult2( [1,['a',3,'b',2],[4,['h',8,[10]]], -5]))
24
我试图对此进行编码:
def mult2(n):
if type(n) == int and n%2 ==0:
return n
def nested_sum(L):
total = 0
for i in L:
if isinstance(i, list):
total += nested_sum(i)
else:
total += i
return total
不幸的是我无法改变mult2(n)函数的代码。我只能更改nested_sum(L)函数。
有人可以告诉我该怎么做? 谢谢。
答案 0 :(得分:2)
将递归分离成一个只执行以下操作的函数会更好:
sum(x for x in iflatten(L) if cond)
其中iflatten
是展平函数的迭代器返回版本,而cond
就是type(x) == int and x % 2 == 0
。
def iflatten(L):
for i in L:
if isinstance(i, list):
for r in iflatten(i):
yield r
else:
yield i
代码测试如下:
L = [1,['a',3,'b',2],[4,['h',8,[10]]], -5]
def iflatten(L):
for i in L:
if isinstance(i, list):
for r in iflatten(i):
yield r
else:
yield i
sum(x for x in iflatten(L) if type(x) == int and x % 2 == 0)
结果为24
。
你无法改变
def mult2(n):
if type(n) == int and n%2 ==0:
return n
我们可以将条件从type(x) == int and x % 2 == 0
更改为mult2(x) is not None
,因为所有函数的末尾都有隐式return None
。
让我们测试一下:
L = [1,['a',3,'b',2],[4,['h',8,[10]]], -5]
def iflatten(L):
for i in L:
if isinstance(i, list):
for r in iflatten(i):
yield r
else:
yield i
def mult2(n):
if type(n) == int and n%2 ==0:
return n
sum(x for x in iflatten(L) if mult2(x) is not None)
同样会产生24
答案 1 :(得分:2)
我不确定示例调用是否正确:
nestedSum(mult2( [1,['a',3,'b',2],[4,['h',8,[10]]], -5]))
在列表中调用mult2()
将始终返回None
。将None
传递给nestedSum()
将始终导致TypeError
。
mult2()
旨在过滤掉非整数和奇数整数。我认为你应该将mult2
作为过滤函数传递给nestedSum()
:
def mult2(n):
if type(n) == int and n%2 ==0:
return n
def nested_sum(L, predicate):
total = 0
for item in L:
if isinstance(item, list):
total += nested_sum(item, predicate)
elif predicate(item):
total += item
return total
现在要调用该函数,将mult2()
作为谓词函数传递给nested_sum():
>>> nested_sum([1,['a',3,'b',2],[4,['h',8,[10]]], -5], mult2)
24
答案 2 :(得分:0)
如果您可以在不使用mult2
的情况下执行此操作但仍必须使用递归,则可以执行此操作:
def sumArr(arr):
return sum([numVal(item) for item in arr])
def numVal(item):
if instanceof(item, int): return item
elif instance(item, list): return sumArr(item)
else: return 0
sumArr([1,['a',3,'b',2],[4,['h',8,[10]]], -5]) # >>> 23