我今天从学校得到了这个任务来制作一个函数Sum(list): 我研究并找到了几种方法如何使用包含int或整数列表的列表的列表,但是我的函数也应该与其他类型如字符串或元组一起使用。以下是它应该做的一些例子。
Sum([1,2,3]) returns 6; Sum([2,[1.5,3],0.5]) returns 7.0;
Sum([[['p'],'yt'],['h',['on']]]) returns 'python'
Sum([[(1,2)],(3,),[(4,5)]]) returns (1, 2, 3, 4, 5);
除此之外,它还应该能够计算函数Sum(X)中的参数是否为NOT列表。例如:
Sum(5*5) returns 25;
到目前为止,这是我正在使用的工作,对于前2个案例工作正常,但是我无法找到修改它以便用于其他示例的方法。 Personaly一直试图使用isinstance和exception
def list_sum(L):
total = 0
for i in L:
if isinstance(i, list):
total += list_sum(i)
else:
total += i
return total
非常感谢任何帮助
答案 0 :(得分:1)
使用第一个非列表值作为总和的初始值。让None
表示我们还没有看到这样的价值:
def list_sum(L):
if not isinstance(L, list):
return L
total = None
for i in L:
i = list_sum(i)
if total is None:
total = i
else:
total += i
return total
此外,在这种情况下,使用isinstance
是最安全的事情。
对于正确处理空列表的强大案例,请使用flattening generator:
def list_sum(l):
def flatten(l):
for el in l:
if isinstance(el, list):
for sub in flatten(el):
yield sub
else:
yield el
if isinstance(l, list):
return sum(flatten(l))
return l
请注意,内置sum
函数适用于该情况。
答案 1 :(得分:0)
这是一个仅使用整数执行此操作的单行程序,以供将来参考:
from itertools import chain as flatten
def nested_sum(l):
return sum(flatten.from_iterable(l))
itertools.chain
非常适合展平嵌套的iterables。