📅  最后修改于: 2023-12-03 15:24:34.999000             🧑  作者: Mango
在python中处理列表是非常常见的操作。当遇到嵌套列表时,我们需要将它展平为一个一维的列表,以便进一步处理。
def flatten(lst):
for item in lst:
if isinstance(item, list):
yield from flatten(item)
else:
yield item
lst = [[1, 2, 3], [4, 5, [6, 7], 8], 9]
result = list(flatten(lst))
print(result)
这个方法使用生成器(Generator)遍历列表中的每个元素,如果元素是列表类型,就进一步递归处理,否则直接将元素yield出去。最终返回一个迭代器对象,需要使用list()方法将其转换为列表。
lst = [[1, 2, 3], [4, 5, [6, 7], 8], 9]
result = [item for sublist in lst for item in (sublist if isinstance(sublist, list) else [sublist])]
print(result)
这个方法使用列表推导式,遍历列表中的每个元素,如果元素是列表类型,就使用一个二次循环,将嵌套列表的元素逐个取出,加入新列表。如果不是列表类型,直接将元素加入新列表。
from functools import reduce
lst = [[1, 2, 3], [4, 5, [6, 7], 8], 9]
result = reduce(lambda x, y: x + y if isinstance(y, list) else x + [y], lst, [])
print(result)
这个方法使用reduce函数,将列表中的元素逐个处理,对于列表类型的元素,将递归展平后的列表与当前元素相加,对于非列表类型的元素,则将其加入新列表中。最终返回一个展平后的新列表。
以上三种方法都可以实现展平嵌套列表的功能,使用时应根据具体情况选择。其中使用迭代器和递归的方法最为pythonic,但需要理解迭代器和生成器的概念。使用列表推导式虽然代码简单,但不够直观。使用reduce函数需要理解reduce的用法,但功能最为强大。