我想写一个函数,它接受一个数字和列表列表,它们也可以包含数字和列表,依此类推......,并返回列表中某处的总数量.
示例:[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
Run Code Online (Sandbox Code Playgroud)
我想我需要recursivley压扁子列表.但我得到错误: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
Run Code Online (Sandbox Code Playgroud)
然后你可以使用生成器和递归来展平迭代:
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] ))
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)[1, 0, 2, 7, 3, 5, 1, 2, 3]
然后你只需要另一个测试,内置sum和事实True计为1和False0
sum(isinstance(item, int) for item in flatten(mylist))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |