Python如何单行将多个列表嵌套组合生成n维列表
首先明确:该需求完全可以通过单行代码实现,且不需要借助numpy库,纯Python原生语法就有多种实现方案,所有方案均不会打散原列表做元素级拼接,符合你要保留子列表结构生成多维列表的要求,避开你提到的zip、extend、+运算符拼接的无效方案。
可用实现方法
直接字面量赋值(最推荐,简洁高效)
不需要提前定义空列表c,直接在定义c时将a、b作为独立元素写入列表即可,一行得到目标结果:a = [1,2,3] b = [4,5,6] c = [a, b]运行后c的结构完全匹配你需要的
[[1,2,3],[4,5,6]],和两次执行append的最终效果完全一致。列表推导式批量装入
如果后续需要纳入更多列表,用列表推导式的写法扩展性更强,不需要重复写append语句:c = [item for item in (a, b)]需要新增子列表时,只要在后面的元组里添加对应的列表变量名即可。
list构造器直接转换
把存储了多个原列表的可迭代对象直接传入list构造器,也能一行生成目标多维列表:c = list((a, b))这里传入的
(a,b)是将a、b作为独立元素存储的元组,不会打散两个列表的内部元素,转换后自然保留二维结构。海象运算符实现先初始化空列表再追加(Python3.8+支持,不推荐日常使用)
如果你一定要保留“先定义空c、再执行append”的逻辑,也可以通过海象运算符写成单行,但可读性较差:(c := []).append(a), c.append(b)
注意事项
上述方法生成的c中,存储的子列表默认是原列表a、b的引用,如果后续修改a或b的内部元素,c中对应的子列表内容会同步变化。如果需要切断这个关联,可以在装入时对原列表做浅拷贝,比如写为
c = [a.copy(), b.copy()],后续修改原列表就不会影响c的内容。
关于numpy的补充说明:numpy生成的是ndarray类型对象,不是Python原生列表,除非你后续需要做大规模数值计算,否则为了该需求专门引入numpy属于冗余操作,没有必要。
内容的提问来源于stack exchange,提问作者Sid133

