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

时间:2018-10-08 07:54:48

标签: 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

我认为我需要递归平整子列表。但是我得到了错误:TypeError: 'int' object is not iterable

3 个答案:

答案 0 :(得分: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

然后,您可以使用生成器和递归来展平可迭代对象:

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))

答案 1 :(得分:1)

def count_ints_in_list(int_list):
    def count(n):
        if isinstance(n, int):  # If it is an integer, add 1 to the count.
            return 1
        elif isinstance(n, str):  # Ignore strings.
            return 0
        elif hasattr(n, '__iter__'):  # If it is iterable, recursively call function.
            return count_ints_in_list(n)
        return 0

    if not hasattr(int_list, '__iter__'):
        return 0

    return sum(count(n) for n in int_list)  # Use a generator to sum the count of all integers.

>>> count_ints_in_list(test)
9

>>> count_ints_in_list('test')
0

# Works with lists, tuples, other non-string iterables.
>>> count_ints_in_list([1, [[(0,2), 7, 3], 5, (1,2)], 3])
9

答案 2 :(得分:1)

要计算元素,您不需要展平列表。只是

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

请注意,这是python中一种常见的方法,即假定该对象是可迭代的,并将其视为可迭代对象,而不是检查isinstance(my_list, list)(“比请求权限更容易获得宽恕” )。