22. 平面列表
题目
给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。
注意事项
如果给定的列表中的要素本身也是一个列表,那么它也可以包含列表。
样例
给定 [1,2,[1,2]]
,返回 [1,2,1,2]
。
给定 [4,[3,[2,[1]]]]
,返回 [4,3,2,1]
。
挑战
请用非递归方法尝试解答这道题。
题解
非递归的做法,stack作为一个容器,来保存每一层的数据
当我们遇到一个元素是列表,我们就把当前列表存起来,把这个元素当作新列表,再枚举处理,再继续上面的操作,
直到某个只有数字的元素,则开始回溯,把stack的列表一个一个pop出来继续处理,直到stack全部处理结束。
这题还有注意的是进来的可能只是一个数字,所以我先[,]下,反正后面会自己解开。还有就是有一些空集合,导致我代码提早跳出,代码还能写更漂亮才对。
def flatten(nestedList): idx = 0 lst = [] stack = [] curList = [nestedList,] while 1: if type(curList[idx]) == list: stack.append([curList, idx]) curList = curList[idx] idx = -1 else: lst.append(curList[idx]) idx += 1 if idx == len(curList): while 1: if len(stack) == 0: return lst curList, idx = stack.pop() idx += 1 if idx < len(curList): break