Python中如何用一行代码按列拼接多维列表数组?
通用一行列表推导式解决方案
嘿,这个需求其实用zip()配合列表推导式就能完美搞定,不管你有多少个子数组都能通用!
核心思路
你的需求本质是把所有子数组的对应行拼接起来——比如第1行是第一个子数组的第1行 + 第二个子数组的第1行 + ... + 第N个子数组的第1行。zip(*input)正好能帮我们把所有子数组的对应行打包成一组,之后只需要把每组里的小列表拼接就行。
方案1:简洁版(适合大多数场景)
input_data = [[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]]] result = [sum(row_group, []) for row_group in zip(*input_data)] print(result) # 输出: [[1,2,7,8],[3,4,9,10],[5,6,11,12]]
zip(*input_data)会将输入的子数组“转置”,把对应行打包成元组:比如示例里会得到([[1,2], [7,8]], [[3,4], [9,10]], [[5,6], [11,12]])sum(row_group, [])的作用是把每组里的多个小列表拼接成一个大列表(用空列表作为初始值,依次累加每组里的子列表)
方案2:高效版(适合处理大列表)
如果你的数据量很大,sum()的列表拼接效率会稍低,推荐用嵌套列表推导式展开:
result = [[item for subrow in row_group for item in subrow] for row_group in zip(*input_data)]
这个写法和方案1效果完全一致,但底层是直接遍历元素构建新列表,性能更优。
为什么你之前的尝试没生效?
- 你写的
[[element for table in input for element in row] for row in table]:这里table在第二层推导式里还没被定义(作用域问题),外层的for table in input是在第一个推导式的循环里,内层无法直接引用。 [[*input[j][i] for j in range(len(input))] for i in range(len(input[0]))]:语法错误,*不能直接放在列表推导式的元素位置,而且这种写法需要手动遍历索引,远不如zip()简洁通用。
多子数组测试
比如给输入加第三个子数组:
input_data = [[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]],[[13,14],[15,16],[17,18]]] result = [sum(row_group, []) for row_group in zip(*input_data)] print(result) # 输出: [[1,2,7,8,13,14],[3,4,9,10,15,16],[5,6,11,12,17,18]]
完全能正常工作,不需要修改代码~
内容的提问来源于stack exchange,提问作者Kalev Maricq
相关产品推荐
相关产品推荐

