Python:计算列表列表中的整体元素

ror*_*oro 1 python

我想写一个函数,它接受一个数字和列表列表,它们也可以包含数字和列表,依此类推......,并返回列表中某处的总数量.

示例:[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

Maa*_*bré 5

一般的方法是首先测试一个项目是否可迭代.不幸的是,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)
[1, 0, 2, 7, 3, 5, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

然后你只需要另一个测试,内置sum和事实True计为1和False0

sum(isinstance(item, int) for item in flatten(mylist))
Run Code Online (Sandbox Code Playgroud)