我想写一个函数,它接受一个数字列表和列表,它又可以包含数字和列表,等等......,并返回列表中某处数字的总数。
示例:[1,[[[0,2],7,3],5,[1,2]],3] 包含 9 个数字。
到目前为止,这是我的代码:
test=[1,[[[0,2],7,3],5,[1,2]],3]
def flatten(mylist):
counter = 0
for i in range(len(mylist)):
if type(mylist[i]) == int:
counter += 1
if type(mylist[i]) == list:
[item for sublist in mylist[i] for item in sublist]
counter += 1
return counter
我想我需要递归地展平子列表。但我收到错误:TypeError: 'int' object is not iterable
请您参考如下方法:
一般方法是首先测试一个项目是否可迭代。不幸的是,str 对象是可迭代的,而在大多数情况下,它们应该算作一个项目,因此不应该被展平。此方法可用于此测试:
def is_iterable(item):
"""tests whether `item` is an iterable that is not a string"""
try:
iter(item)
return not isinstance(item, str)
except TypeError:
return False
然后您可以使用生成器和递归来展平可迭代对象:
def flatten(iterable):
for item in iterable:
if is_iterable(item):
yield from flatten(item)
else:
yield item
list(flatten([1,[[[0,2],7,3],5,[1,2]],3] ))
[1, 0, 2, 7, 3, 5, 1, 2, 3]
然后你只需要另一个测试,内置的 sum 和事实 True 算作 1 而 False 算作 0
sum(isinstance(item, int) for item in flatten(mylist))
