📜  Python程序在不使用递归的情况下展平列表

📅  最后修改于: 2022-05-13 01:54:21.003000             🧑  作者: Mango

Python程序在不使用递归的情况下展平列表

任务是在Python中将嵌套列表转换为单个列表,即无论Python列表中有多少层嵌套,都必须删除所有嵌套列表才能将其转换为包含所有值的单个列表最外面的括号内的列表,但里面没有任何括号。换句话说,列表中的元素可以是数字或列表。它需要转换为一个列表,其中列表中的每个元素只是一个数字。

例子:

有两种方法可以在不使用递归的情况下做到这一点。

方法一:使用堆栈

方法:

  • 初始化:将主链表压入栈中
  • 制作一个空列表来存储最终结果(结果变量)
  • 循环直到栈不为空
    1. 弹出栈中最后添加的元素并存储(当前变量)
    2. 如果弹出的元素是一个列表,则将该列表的所有元素推入堆栈
    3. 如果弹出的元素不是列表,则在结果中附加该元素
  • 反转结果列表以得到原始列表顺序的最终输出

下面是实现:

Python3
# Input list
l = [1, 2, [3, 4, [5, 6], 7],
     [[[8, 9], 10]],
     [11, [12, 13]]]
  
# Function to flatten the the list
  
  
def flatten(input_list):
    # Final list to be returned
    result = []
  
    # Creating stack and adding 
    # all elements into it
    stack = [input_list]
  
    # Iterate stack till it
    # does not get empty
    while stack:
  
        # Get the last element of the stack
        current = stack.pop(-1)
  
        # If the last element is a list,
        # add all the elements of that list in stack
        if isinstance(current, list):
            stack.extend(current)
              
        # Else add that element in the result
        else:
            result.append(current)
  
    # Reverse the result to get the
    # list in original order
    result.reverse()
  
    return result
  
  
# output list
ans = flatten(l)
print(ans)


Python3
from iteration_utilities import deepflatten
  
l = [1, 2, [3, 4, [5, 6], 7], 
     [[[8, 9], 10]], [11, [12, 13]]]
  
ans = list(deepflatten(l))
print(ans)


输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

方法二:使用库

包迭代实用程序也可用于展平列表。

蟒蛇3

from iteration_utilities import deepflatten
  
l = [1, 2, [3, 4, [5, 6], 7], 
     [[[8, 9], 10]], [11, [12, 13]]]
  
ans = list(deepflatten(l))
print(ans)

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]