如何递归地向列表中添加元素?

3

目前,我正在处理一个问题。给定一个列表,其元素可能包含其他列表、列表的列表或整数。例如,我可能会收到:

[[[[], 1, []], 2, [[], 3, []]], 4, [[[], 5, []], 6, [[], 7, [[], 9, []]]]]

我的目标是解析数组,并将仅限整数追加到一个新的列表中。以下是我迄今为止完成的内容:

def fun(a):
    if a == []:
        return None
    elif type(a) == int:
        print("Found a digit: ", a)
        return a
    for i in a:
        fun(i)

目前,这个函数递归地遍历列表并成功找到每个整数;现在,我的问题在于将这些整数添加到一个新列表中,并在最后返回该列表。输出应该如下:

[1,2,3,4,5,6,7,9]

有什么建议吗?


1
有什么“问题”? - martineau
"fun" 函数不应该直接返回 "a";而是应该将 "a" 添加到一个列表中,并在最终返回时返回该列表,或者使用 "yield" 返回 "a"。 - chepner
2个回答

6
将要添加到列表末尾的列表作为参数传递。
def fun(a, result):
    if type(a) == int:
        print("Found a digit: ", a)
        result.append(a)
    else:
        for i in a:
            fun(i, result)
old_list = [[[[], 1, []], 2, [[], 3, []]], 4, [[[], 5, []], 6, [[], 7, [[], 9, []]]]]
new_list = []
fun(old_list, new_list)
print(new_list)

如果您需要原始函数签名,可以将其拆分为两个函数。
def fun(a):
    result = []
    fun_recursive(a, result)
    return result

fun_recursive()将如上所定义。


是的,我考虑过这样做,但问题在于这个问题需要我上面指定的特定函数声明,意味着只有一个参数:数组。 - Darrel Gulseth
将其拆分为两个函数,我已经更新了答案以显示如何操作。 - Barmar

4
您可以尝试以下方法:
def fun(a):
    if isinstance(a, int):
        yield a
    else:
        for e in a:
            yield from fun(e)

print(list(fun([[[[], 1, []], 2, [[], 3, []]], 4, [[[], 5, []], 6, [[], 7, [[], 9, []]]]])))

输出:

[1, 2, 3, 4, 5, 6, 7, 9]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接