嵌套列表元素提取:如何转换嵌套元组列表为目标数字列表
解决嵌套元组列表的元素提取问题
首先得说清楚你之前为啥没得到正确结果:你用的l=[x[1] for x in l0],这里的x是l0里的每一个子列表(比如[('x0', 2), ('x1', 3)]),所以x[1]取的是子列表里的第二个元组,自然得到[('x1', 3), ('x3', 7)],这不是你想要的,得遍历到子列表里的每个元组才行。
需求1:保留层级结构,得到非扁平化列表 [[2,3],[5,7,1]]
这个需要两层列表推导式,外层遍历l0里的每个子列表,内层遍历子列表里的每个元组,提取元组的第二个元素:
l0 = [[('x0', 2), ('x1', 3)], [('x2', 5), ('x3', 7), ('x4', 1)]] l = [[item[1] for item in sublist] for sublist in l0] print(l) # 输出: [[2, 3], [5, 7, 1]]
也可以用普通循环实现,逻辑是一样的:
l = [] for sublist in l0: temp = [] for item in sublist: temp.append(item[1]) l.append(temp)
需求2:扁平化列表,得到 [2,3,5,7,1]
有几种简单的实现方式:
方法1:单层嵌套的列表推导式
把两层循环合并到一个推导式里,顺序是外层循环在前,内层在后:
l = [item[1] for sublist in l0 for item in sublist] print(l) # 输出: [2, 3, 5, 7, 1]
方法2:用itertools.chain扁平化嵌套结构
如果嵌套层数更多或者列表很大,用itertools.chain会更高效:
from itertools import chain l = [item[1] for item in chain(*l0)] # 或者写成 chain.from_iterable(l0),不用解包* # l = [item[1] for item in chain.from_iterable(l0)] print(l) # 输出: [2, 3, 5, 7, 1]
方法3:用sum快速扁平化(适合小型列表)
sum(l0, [])可以把嵌套列表合并成一个单层列表,不过这种方法在列表很大时效率不高,只适合小数据量:
l = [item[1] for item in sum(l0, [])] print(l) # 输出: [2, 3, 5, 7, 1]
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

