我正在编写一个函数来展平嵌套数组(Pythonlist
)。例如将[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]
在进行递归调用时,如何保持展平数组的状态?
更改线条
else:
flatten_array(item)
到
else:
flattened_array+=flatten_array(item)
所以完整函数的内容如下
def flatten_array(array):
flattened_array = []
for item in array:
if not isinstance(item, list):
flattened_array.append(item)
else:
flattened_array+=flatten_array(item)
return flattened_array
这给
flatten_array([1,2,[3]]) # [1,2,3]
flatten_array([1,2,[3,[4,5]]]) # [1,2,3,4,5]
flatten_array([1,2,[3,[4,5]],6,7,[8]]) # [1,2,3,4,5,6,7,8]
您的原始代码对递归调用没有任何作用。您可以在列表中取回结果,但只需丢弃它。我们要做的是将其附加到现有列表的末尾。
此外,如果您不想继续创建临时数组,我们可以在第一次调用函数时创建一个数组,然后附加到它。
def flatten_array(array,flattened_array=None):
if flattened_array is None:
flattened_array = []
for item in array:
if not isinstance(item,list):
flattened_array.append(item)
else:
flatten_array(item,flattened_array)
return flattened_array
此版本的结果是相同的,可以以相同的方式使用,但在原始版本中,对函数的每次调用都会创建一个新的空数组来使用。通常这不是问题,但这取决于深度或子数组在内存中的大小。
此版本将阵列展平为给定阵列。仅使用输入调用时(如展平数组([1,2,[3])),它会创建一个空数组来处理,否则它只会添加到给定的数组中(因此递归调用只需要提供要添加的数组),并在适当的位置对其进行修改。
如果我们需要,这具有允许您添加到现有数组的优势:
a = [1,2,3]
b = [2,3,[4]] # we want to add flatten this to the end of a
flatten_array(b,a) # we don't bother catching the return result here
print(a) # [1,2,3,2,3,4]
这可能不是我们想要的。通过将默认值设置为“无”,并每次在函数中创建一个新的空数组,我们可以确保对函数的每次调用都有一个唯一的空数组。
想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我有以下递归方法: 在本例中,当我调用其中的方法时,以及使用方法I时,会再次创建parentUuids,并且会丢失其值。 另一方面,当使用如下所示的方法II时,我保留了值: 我的问题是: 1.方法II是保留局部变量值的正确方法吗? 2.这是一种特殊的用法吗?它叫什么名字?我以前从未使用过这种方法,但我认为它可能对这种情况有用。
函数甚至可以不使用局部变量来调用自己. 例子 23-14. 汉诺塔 1 #! /bin/bash 2 # 3 # 汉诺塔(The Towers Of Hanoi) 4 # Bash script 5 # Copyright (C) 2000 Amit Singh. All Rights Reserved. 6 # http://hanoi.kernelthrea
所以,如果我调用fact(3),那么每个调用结果变量将在堆栈中获得单独的内存? (如果这是一个愚蠢的问题,很抱歉,但我似乎无法掌握这个概念。)
即使不适用局部变量,函数也可以递归的调用自身。 例子24-16. 斐波那契序列 #!/bin/bash # fibo.sh : 斐波那契序列 (递归) # 作者: M. Cooper # License: GPL3 # ----------算法-------------- # Fibo(0) = 0 # Fibo(1) = 1 # else # Fibo(j) = Fibo(j-1) + Fi
所以我正在用Visual Studio编写一个Android应用程序。我想要一个既有纵向又有横向的活动。当我打开我的设备时,我的活动中的数据消失了。所以我在网上查了一下,找到了一行放在清单中的数据,这很有效!Android:config changes = " orientation | keyboard hidden | screen size "除了我所有的视图都是无序的、错位的。我使用了两种