Python嵌套列表转一维(压平嵌套列表)

本文讨论了在Python中如何将多维列表转化为一维列表的方法,包括使用迭代和列表生成式等策略。内容源于一次面试经历,当时未能即时给出可行代码,后经过研究总结。

       前一段去云英面试,技术官很”不厚道“了问了一个非常简单的问题:如何将多维列表转化了一维的?当时虽然想到了使用迭代或者列表生成式可以做到,但是可以没能可行的代码,回来后一顿后悔。

     对于规范的且嵌套维度较低的多维列表,python中有很多方法可以实现:

     

a=[[1,2],[3,4],[5,6]]
print [j for i in li for j in i]
#or
from itertools import chain
print list(chain(*a))
#or
import itertools
a = [[1,2,3],[4,5,6], [7], [8,9]]
out = list(itertools.chain.from_iterable(a))
#or
a=[[1,2],[3,4],[5,6]]
t=[]
[t.extend(i) for i in a]
print t
#or
a=[[1,2],[3,4],[5,6]]
print sum(a,[])
#or
reduce(lambda x, y: x+ y, a)
     对于复杂的多维嵌套列表就需要使用一些复杂的方法:
#递归的方法比较容易理解
def expand_list(nest
<think>我们参考上述引用来回答用户的问题:如何将嵌套列表(可能是多维)展开为一维列表。 引用中提供了多种方法,包括递归、列表推导式、itertools.chain、reduce等。我们将根据引用内容总结几种常见方法。 注意:引用[3]提到嵌套层数未知的情况,需要使用递归;引用[4]列出了多种方法。 我们将介绍以下方法: 1. 使用嵌套循环展开(已知嵌套层数) 2. 使用递归(未知嵌套层数) 3. 使用itertools.chain(已知嵌套层数,且每层都是列表) 4. 使用functools.reduce(同上) 5. 使用sum函数(同上) 6. 使用列表推导式(已知层数) 同时,我们注意到引用[3]中有一个递归生成器的例子,以及一个lambda表达式的递归版本(但注意,lambda递归在Python中可能不太直观,且那个写法有误,我们将修正)。 由于用户需求是“将嵌套列表展开为一维列表”,我们假设嵌套可以是任意深度的。因此,递归方法更通用。 步骤: 1. 首先介绍已知层数的情况(例如二维列表) 2. 然后介绍任意嵌套深度的情况 注意:在引用[3]中,递归方法的代码使用了生成器(yield),我们可以稍微修改以返回列表。 另外,引用[4]中提到了多种方法,但有些只适用于二维。 我们根据引用内容,给出以下实现: 方法1:已知是二维列表 方法2:任意嵌套(递归) 方法3:使用itertools.chain(只适用于二维) 方法4:使用reduce(只适用于二维) 方法5:使用sum(只适用于二维) 我们将分别展示这些方法,并给出代码示例。 同时,我们还要注意引用[3]中提到的递归生成器方法,我们可以将其换为返回列表的函数。 另外,引用[3]中有一个lambda递归的写法,但原写法有误(会导致递归无限),我们将修正。 开始回答: </think>### Python实现将嵌套列表展开为一维列表的方法 根据引用内容,整理6种常用方法实现嵌套列表降维操作: #### 1. 列表推导式(已知嵌套层数)[^1][^2] 适用于二维列表,通过双重循环展开: ```python arr = [[1,2,3], [4,5,6], [7,8,9]] flat = [item for sublist in arr for item in sublist] # 结果: [1,2,3,4,5,6,7,8,9] ``` #### 2. 嵌套循环追加(通用二维)[^1][^4] 通过显式循环实现: ```python result = [] for sublist in arr: for item in sublist: result.append(item) ``` #### 3. 递归展开(任意嵌套层数)[^3][^4] 处理多层嵌套列表的通用方法: ```python def flatten(nested_list): result = [] for item in nested_list: if isinstance(item, list): result.extend(flatten(item)) else: result.append(item) return result print(flatten([1, 'a', ['b', ['c'], [ ], [3, 4]]])) # 输出: [1, 'a', 'b', 'c', 3, 4] ``` #### 4. 使用itertools模块(高效二维展开)[^4] ```python import itertools flat = list(itertools.chain.from_iterable(arr)) ``` #### 5. 使用functools.reduce(二维列表)[^3][^4] ```python from functools import reduce flat = reduce(lambda x,y: x+y, arr) ``` #### 6. 使用sum函数(二维简洁写法)[^4] ```python flat = sum(arr, []) # 第二个参数[]表示初始值为空列表 ``` #### 各方法适用场景对比: | 方法 | 嵌套深度 | 性能 | 代码简洁度 | |---------------------|----------|--------|------------| | 递归 | 任意 | 较低 | ★★☆ | | 列表推导式 | 固定层数 | 高 | ★★★ | | itertools.chain | 二维 | 最高 | ★★☆ | | reduce | 二维 | 中 | ★★☆ | > 对于超过二维的嵌套结构,递归方法是最可靠的解决方案[^3]。当处理大型数据集时,建议使用`itertools.chain`以获得最佳性能[^4]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值