Python中嵌套列表按列合并:提取子列表元素重组
问题分析
你需要将原列表中同一列的元素合并为子列表,本质是对二维列表进行转置,同时提取每个子列表中的唯一元素。当前代码存在以下问题:
- 循环顺序错误,应该先遍历列索引,再遍历行索引
- 错误地将整个
X列表追加到子元素中,导致出现递归引用的[...] - 没有正确收集结果到
X1中,每次赋值都会覆盖之前的数据
正确解法
方法一:嵌套循环(手动实现)
调整循环顺序,先遍历列,再遍历每一行的对应列元素,提取值后收集到结果列表中:
X = [[[1], [2], [3], [4], [5]], [[8], [4], [6], [2], [3]], [[9], [1], [2], [5], [1]]] X1 = [] # 遍历每一列(原列表中每个子列表的长度就是列数) for j in range(len(X[0])): col = [] # 遍历每一行,提取当前列的元素值 for i in range(len(X)): col.append(X[i][j][0]) # 因为每个元素是单元素列表,取[0]提取值 X1.append(col) print(X1)
输出结果:
[[1, 8, 9], [2, 4, 1], [3, 6, 2], [4, 2, 5], [5, 3, 1]]
方法二:使用zip函数(更简洁)
利用zip函数快速转置列表,再配合列表推导式提取元素值:
X = [[[1], [2], [3], [4], [5]], [[8], [4], [6], [2], [3]], [[9], [1], [2], [5], [1]]] # zip(*X) 会将原列表转置,得到每一列的元素组,再遍历每个组提取值 X1 = [[item[0] for item in col] for col in zip(*X)] print(X1)
输出结果与上面一致。
原代码错误原因
- 循环顺序颠倒:先遍历行再遍历列,导致每次处理的是行内元素,而非列元素
- 赋值与追加错误:
X1 = X[i][j]让X1指向原列表的子元素,后续X1.append(X)将整个X追加到该子元素中,造成递归引用(输出中的[...]由此产生) - 未收集结果:从未将处理后的子列表添加到
X1,反而每次覆盖X1的值
内容的提问来源于stack exchange,提问作者user19977266
相关产品推荐
相关产品推荐

