如何从多个嵌套列表中提取子列表单侧元素生成两个新列表?
问题描述
现有多个嵌套列表示例如下:
list1 = [[1,2],[56,32],[34,244]] list2 = [[43,21],[30,1],[19,3]] list3 = [[1,3],[8,21],[9,57]]
所有子列表仅包含两个元素,且所有外层列表的子列表数量一致。需要生成两个新列表:
right_side = [2,32,244,21,1,3,3,21,57] left_side = [1,56,34,43,30,19,1,8,9]
如何实现该需求?
解决方案
这里有几种Python实现的方法,按需选择:
方法1:列表推导式(简洁高效)
先把所有输入列表整合到一个大列表里,然后通过列表推导式分别提取每个子列表的左右元素:
list1 = [[1,2],[56,32],[34,244]] list2 = [[43,21],[30,1],[19,3]] list3 = [[1,3],[8,21],[9,57]] all_lists = [list1, list2, list3] left_side = [sublist[0] for lst in all_lists for sublist in lst] right_side = [sublist[1] for lst in all_lists for sublist in lst] print(left_side) # 输出: [1, 56, 34, 43, 30, 19, 1, 8, 9] print(right_side) # 输出: [2, 32, 244, 21, 1, 3, 3, 21, 57]
这种写法是Python的惯用风格,代码短且效率高。
方法2:嵌套循环(新手友好)
如果觉得列表推导式的双层循环不好理解,用普通嵌套循环逐个添加元素更直观:
list1 = [[1,2],[56,32],[34,244]] list2 = [[43,21],[30,1],[19,3]] list3 = [[1,3],[8,21],[9,57]] all_lists = [list1, list2, list3] left_side = [] right_side = [] for lst in all_lists: for sublist in lst: left_side.append(sublist[0]) right_side.append(sublist[1]) print(left_side) print(right_side)
逻辑很直白:先遍历每个外层列表,再遍历里面的子列表,把每个子列表的第一个元素丢进left_side,第二个丢进right_side。
方法3:itertools优化(处理大量数据)
如果你的输入列表特别多或者子列表数量极大,用itertools.chain可以避免生成中间大列表,节省内存:
import itertools list1 = [[1,2],[56,32],[34,244]] list2 = [[43,21],[30,1],[19,3]] list3 = [[1,3],[8,21],[9,57]] all_lists = [list1, list2, list3] flattened = itertools.chain.from_iterable(all_lists) left_side = [] right_side = [] for item in flattened: left_side.append(item[0]) right_side.append(item[1]) print(left_side) print(right_side)
chain.from_iterable会逐个生成子列表,不会一次性把所有子列表都加载到内存里,适合处理大规模数据场景。
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

