在尝试压缩列表时,如果我传递字符串,我会遇到无限递归。据我所知,这是因为字符串的第一个元素又是一个字符串,而这个字符串又可以被迭代。我通过查看我的元素是否像字符串一样嘎嘎而解决了这个问题,因此是第二个例外。这看起来相当混乱。而且,真正的问题来自于字符串对它们的递归没有“基本情况”这一事实。是否有其他具有此属性的对象?
有没有人有更清洁的解决方案?
def nestedsum(lst, init_sum):
for itm in lst:
try:
init_sum +=itm
except TypeError as e:
#check if we have some string iterator
# as this can cause infinite recurrsion
try:
itm + ''
except TypeError as e2:
init_sum +=nestedsum(itm)
else:
raise TypeError("Strings cannot be summed over")
return init_sum
提前致谢。对不起,如果有某个类似的帖子,但我找不到运气。
答案 0 :(得分:1)
我相信这会做你想要的,也可以用字符串。
def nestedsum(lst, init_sum):
for itm in lst:
if isinstance(itm, (float, int)):
init_sum += itm
elif isinstance(itm, (tuple, list)):
init_sum += nestedsum(itm, init_sum)
else:
continue
return init_sum
答案 1 :(得分:0)
可能是更好的方法,但您可以使用isinstance()
检查该项目是否为列表。
def sum_messy_nest(l, current=0):
for item in l:
if isinstance(item, int) or isinstance(item, float):
current += item
elif isinstance(item, list):
current += n(item, current)
else:
raise TypeError("I don't know this: {}".format(repr(item)))
return current