【问题标题】:How to recursively add items to a list?如何递归地将项目添加到列表中?
【发布时间】:2020-01-30 04:01:07
【问题描述】:

目前,我正在解决一个问题。我得到一个列表,其元素可能包含其他列表、列表列表或整数。例如,我可能会收到:

[[[[], 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]

任何指针?

【问题讨论】:

  • 有什么“问题”?
  • fun 不应该返回 a;它应该将a 附加到将最终返回的列表,或者它应该yield a

标签: python arrays list recursion


【解决方案1】:

将要追加的列表作为参数传递。

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() 的定义如上。

【讨论】:

  • 是的,我想过这样做,但问题是这个问题需要我上面指定的特定函数声明,意味着只有一个参数:数组。
  • 把它分成两个函数,我已经更新了答案来展示如何。
【解决方案2】:

你可以试试:

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]

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2019-03-12
    • 1970-01-01
    • 2015-04-17
    • 2023-04-06
    • 2022-01-16
    • 1970-01-01
    • 2010-10-14
    • 2021-01-29
    相关资源
    最近更新 更多