在 Python 中将 N 维数组展平为一维数组 [duplicate]

Flatten a N-Dimensional Array into a 1D Array in Python [duplicate]

提问人:user22878443 提问时间:11/8/2023 更新时间:11/8/2023 访问量:46

问:

目标:使用 Python3 将具有 N 个嵌套列表的数组转换为一维数组。

示例数组:将示例数组转换为以下结果:ND_array = [1, [2, 3], [4, [5, 6]], 7, [8, 9, [10, 11, 12, [13, [14, 15, 16], 17], 18], 19, 20], 21] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

不受原始数组所具有的维数限制的最优解。

数组 python-3.x list 多维数组

评论

0赞 Goku - stands with Palestine 11/8/2023
请展示你尝试过什么?

答:

-2赞 M007 11/8/2023 #1

适用于 python 中任何 N 维数组的一个简单易行的解决方案是利用递归。

oneD_array = []

def transform_array(arr):
    for x in arr:
        if type(x) == list:
            transform_array(x)
        else:
            oneD_array.append(x)
    return oneD_array

ND_array = [1, [2, 3], [4, [5, 6]], 7, [8, 9, [10, 11, 12, [13, [14, 15, 16], 17], 18], 19, 20], 21]

print(transform_array(ND_array))

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

版本2.0:输出与上述相同

def transform_array(arr, oneD_array):
    for x in arr:
        if isinstance(x, list):
            transform_array(x, oneD_array)
        else:
            oneD_array.append(x)
    return oneD_array

评论

0赞 user22878443 11/8/2023
这太棒了,而且效果很好!StackOverFlow 上没有其他解决方案如此简单,可用于任何 N 维数组。
0赞 user2390182 11/8/2023
@user22878443 你搜索了什么?从字面上看,有数百个重复项,几乎所有的答案都像这个一样简单。另外:这个实际上非常可怕!如果由于笨拙地使用全局变量而只能使用一次,那么函数有什么用。另外,不要用于检查类型。用!type(...) == ...isinstance
0赞 user22878443 11/8/2023
许多其他文章都使用导入的包来解决问题,而有些文章不适用于我发现的重维数组。此解决方案提供了坚实的基准。我不认为这是一个糟糕的解决方案,因为他们用基线递归解决方案回答了这个问题。您始终可以基于给定的示例代码进行构建,以不包含全局变量的使用;正如我在代码中所做的那样。可能不是最优化的解决方案,但提供了坚实的基础。我确实同意用“if isinstance(x, list):”替换第一个 if 语句更好
0赞 M007 11/8/2023
没错,我打算不使用新包将解决方案修改为当前代码。您可以向 transform_array 函数添加第二个参数,并在 if 语句之后的递归调用中继续返回列表。最初调用该函数时,只需将一个空列表作为第二个参数。