我正在编写一个函数来展平嵌套数组(Pythonlist
)。e、 g将[1,2,[3]]变成[1,2,3],[1,2,[3]],4]变成[1,2,3,4]等
我有以下几点:
def flatten_array(array):
flattened_array = []
for item in array:
if not isinstance(item, list):
flattened_array.append(item)
else:
flatten_array(item)
return flattened_array
因此,我们的想法是让函数递归,以处理嵌套到未知深度的情况。我的问题是每次遇到嵌套列表时flattened_array
都会被重新初始化(当flatten_array
被递归调用时)。你知道吗
print flatten_array([1,2,[3]])
[1,2]
当进行递归调用时,如何保持flattened_array
的状态?你知道吗
换行
至
所以完整的函数读起来像
这给
您的原始代码没有对递归调用执行任何操作。你可以从列表中得到结果,但是你可以放弃它。我们要做的是将其附加到现有列表的末尾。你知道吗
此外,如果您不想继续创建临时数组,我们可以在第一次调用该函数时创建一个数组,只需附加到它。†
这个版本的结果是相同的,并且可以以相同的方式使用,但是在原始版本中,每次调用函数都会创建一个新的空数组来处理。通常这不是问题,但取决于深度或子数组在内存中的大小。你知道吗
此版本将数组展平为给定的数组。当只使用输入调用时(如
flatten_array([1,2,[3]])
),它会创建一个空数组来使用,否则它只会添加到给定的数组中(因此递归调用只需要指定要添加的数组),并对其进行适当的修改。你知道吗这样做的好处是,如果需要,您可以添加到现有阵列:
这里有一个微妙的点。您可能会问为什么我们没有将函数定义为
def flatten_array(array,flattened_array=[])
,并了解函数内部的测试。尝试一下,然后调用函数几次。默认值只在函数定义时创建一次,而不是每次调用函数时创建一次。这意味着每个函数调用都会共享就地修改的默认数组,从而使其累积结果。这可能不是我们想要的。通过将默认值设置为
None
,并每次在函数中创建一个新的空数组,我们可以确保每个对函数的调用都有一个唯一的空数组来处理。你知道吗相关问题 更多 >
编程相关推荐