我如何编写一个递归函数来将所有数字添加到深层嵌套的数字和单词列表中

时间:2015-03-23 03:29:59

标签: python

您好我在遇到这个问题时遇到了麻烦它要求我写一个递归函数,它将所有数字添加到一个深层嵌套的列表中,该列表由数字和单词组成。

我已经尝试过,但没有在哪里。

4 个答案:

答案 0 :(得分:3)

我会从"过滤器开始#34;函数只产生数字:使用Py 3.4或更好,可能是

import numbers
def getnumbers(alist, number_class=numbers.Number):
    for x in alist:
        if isinstance(x, number_class):
            yield x
        elif isinstance(x, list):
            yield from getnumbers(x)

(如果需要,很容易翻译成旧版本,只是不那么优雅: - )。

然后,

sum(getnumbers(alist))

将完成这项工作。

我认为这"分解"所有数字的选择,除了数字和单词的深层嵌套列表中的数字,除了对它们进行求和之外,还可以提供比将两个任务压缩成单个函数更优雅和可重用的代码。

答案 1 :(得分:3)

def nested_sum(q):
    sum = 0
    for v in q:
        if type(v) == int or type(v) == float:
            sum += v
        elif type(v) == list:
            sum += nested_sum(v)
    return sum

答案 2 :(得分:1)

total = 0

def flat_sum(q):
    global total
    if not q:
        return
    if isinstance(q, list):
        if not isinstance(q[0], list) and not isinstance(q[0], str):
            total += q[0]
        else:
            flat_sum(q[0])
        flat_sum(q[1:])
    else:
        if not isinstance(q, str):
            total += q

flat_sum([1,"b",[4.7, 'a', -1, 99, ['hi', [7, 0]]]])
print total

答案 3 :(得分:1)

您可以使用numbers.Number检查任何数字类型。

from numbers import Number

def flat_sum(lst):
    if len(lst) == 0:
        return 0

    hd, tl = lst[0], lst[1:]

    if isinstance(hd, list):
        return flat_sum(hd) + flat_sum(tl)
    elif isinstance(hd, Number):
        return hd + flat_sum(tl)
    else:
        return flat_sum(tl)