作为练习,我创建了一个代码,该代码以递归方式对列表中的元素进行求和,包括列表中的列表。
样本列表:a = [1,2,[3,4],[5,6]]
样本结果:21
我的代码如下:
a = [1,2,[3,4],[5,6]]
def sum(list):
if len(list[0]) == 1 and len(list) ==1: # case where list is [x]
return list[0]
elif len(list[0]) == 1 and len(list) > 1: # case where list is [x, etc]
return list[0] + sum(list[1:])
elif len(list[0]) > 1 and len(list == 1): # case where list is [[x,etc]]
return sum(list[0])
else: # case where list is [[x, etc], etc]
return sum(list[0]) + sum(list[1:])
print (sum(a))
然而,当我尝试运行它时,我得到了错误"类型' int'没有长度。"我的印象是,如果list [0]本身不是一个列表,那么它只有1的长度,但很明显,这不起作用。我应该做些什么来检查列表中的元素本身是否为列表?
答案 0 :(得分:3)
我应该做些什么来检查列表中的元素本身是否为列表?
if isinstance(x, list):
常见问题您不应将自己的变量命名为list
,因为您会覆盖类型list
和函数list()
同样适用于您的函数sum()
。您不希望覆盖已处理数字列表的sum()
函数。
或另一种方式是hasattr(lst, "__len__")
from numbers import Number
def recur_sum(lst):
# Return single value immeadiately
if not lst or lst is None:
return 0
if isinstance(lst, Number):
return lst
head = None
tail = False
if hasattr(lst, "__len__"):
_size = len(lst)
if _size <= 0: # case where list is []
head = 0
elif _size >= 1:
if hasattr(lst[0], "__len__"): # case where list is [[x,etc]]
head = recur_sum(lst[0])
else: # case where list is [x]
head = lst[0]
tail = (_size > 1)
if not tail:
return head
else:
return head + recur_sum(lst[1:])
答案 1 :(得分:2)
简而言之,您可以使用 isinstance 功能检查元素是否为列表。
下面的代码可以作为一个例子。
a = [1,2,[3,4],[5,6]]
a
Out[3]:
[1, 2, [3, 4], [5, 6]]
isinstance(a,list)
Out[4]:
True
isinstance(a[0],list)
Out[5]:
False
isinstance(a[2],list)
Out[6]:
True
答案 2 :(得分:0)
对于列表中的item
,您可以将if条件更改为if type(item) is list:
a = [1,2,[3,4],[5,6]]
for item in a:
if type(item) is list:
# do_something_with(item)
print(item)
,输出如下:
[3,4]
[5,6]
确保保留字list
不会被覆盖为变量!