Python:统计列表列表中的所有元素

Python:统计列表列表中的所有元素,python,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:

我想写一个函数,它接受一个数字和列表的列表,它同样可以包含数字和列表,等等…,并返回列表中某个位置的数字总数

示例:
[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”对象不可iterable

通常的方法是首先测试一个项目是否可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
然后可以使用生成器和递归来展平iterable:

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] ))
然后,您只需要另一个测试,内置的
sum
和事实
True
分别计算为1和
False
为0

sum(isinstance(item, int) for item in flatten(mylist))

一般的方法是首先测试一个项目是否合适。不幸的是,
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
然后可以使用生成器和递归来展平iterable:

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] ))
然后,您只需要另一个测试,内置的
sum
和事实
True
分别计算为1和
False
为0

sum(isinstance(item, int) for item in flatten(mylist))

要计算元素,不需要展平列表。简单地

def count(lst):
    try:
        return sum(count(item) for item in lst)
    except TypeError:
        return 1

请注意,python中的一种常见方法是假设对象是可编辑的,并将其视为可编辑的,而不是检查
isinstance(my_list,list)
(“请求原谅比允许更容易”)。

计算不需要展平列表的元素。简单地

def count(lst):
    try:
        return sum(count(item) for item in lst)
    except TypeError:
        return 1

请注意,python中的一种常见方法是假设对象是可编辑的,并将其视为可编辑对象,而不是检查
isinstance(my_list,list)
(“请求原谅比允许更容易”)。

在列表理解中,它不做任何事情(因为没有为其值指定名称)您假设
mylist[i]
的元素是列表(
用于mylist[i]中的子列表…
)。如果
mylist[i]
包含一个不可iterable元素,在您的特定情况下为整数,则会出现错误。在列表理解中,这不起任何作用(因为您没有为其值指定名称),您假设
mylist[i]
的元素是列表(
用于mylist[i]中的子列表…
)。如果
mylist[i]
包含一个不可数元素,在您的特定情况下为整数,则会出现错误。您是否尝试过
count(('abc',2))
@MaartenFabré:问题是“数字和列表”。与字符串无关。@blue\u注意,这是一个很好的计数数字的简短方法+1您尝试计数('abc',2))@MaartenFabré:问题是“数字和列表”。关于字符串什么都没有。@blue\u注意,这是一个很好的计数数字的简短方法+1注意,使用
hasattr
检查
\uiter\uuuu
方法很容易出错。请参见答案中的事实2。我知道这些问题,但觉得它们远远超出了问题的范围。请注意,使用
hasattr
检查
\uu iter\uuu
方法容易出错。请参见答案中的事实2。我知道这些问题,但觉得它们远远超出了问题的范围。