如何为嵌套列表中的子列表填充空字符串以统一长度?
问题:统一嵌套列表子列表长度,不足部分用空字符串补全
给定一个包含不同长度子列表的嵌套列表,需要生成一个所有子列表长度一致的新嵌套列表,长度取原列表中子列表的最大长度,不足的位置用空字符串填充。
输入列表:
tableData = [['apples', 'oranges', 'cherries', 'banana'], ['Alice', 'Bob', 'Carol', 'David','Katherine'], ['dogs', 'cats', 'moose', 'goose']]
我的尝试与问题
先获取所有子列表的最大长度width,然后编写初始化列表的代码:
mytable = [] mytable2 = [] mytable3 = [] for i in range(len(tableData)): for j in range(width): if len(mytable) < width: mytable.append("") else: break mytable2.append(mytable)
接着尝试替换值,但找不到合适的条件阻止循环覆写:
for i in range(len(tableData)): for j in range(len(tableData[i])): if mytable[j] == "": mytable[j] = tableData[i][j] else: break mytable3.append(mytable)
最终得到的输出里所有子列表被同时覆写:
[['apples', 'oranges', 'cherries', 'banana', ''], ['apples', 'oranges', 'cherries', 'banana', ''], ['apples', 'oranges', 'cherries', 'banana', '']]
问题原因与解决方案
问题根源
你所有的子列表都引用了同一个mytable对象,每次向mytable2或mytable3添加mytable时,只是把这个列表的引用存进去,而非创建新的副本。后续修改mytable内容时,所有引用它的子列表都会同步变化,最终导致所有子列表内容完全相同。
正确实现方式
步骤1:计算最大长度
先找出原列表中子列表的最大长度:
width = max(len(sublist) for sublist in tableData)
步骤2:逐个补全子列表
遍历每个子列表,复制原元素后补充空字符串到指定长度:
result = [] for sublist in tableData: # 复制原列表元素,避免修改原数据 padded_sublist = sublist.copy() # 计算需要补充的空字符串数量,添加到列表末尾 padded_sublist += [""] * (width - len(sublist)) result.append(padded_sublist)
更简洁的列表推导式写法
可以用一行代码完成:
width = max(len(lst) for lst in tableData) result = [lst + [""]*(width - len(lst)) for lst in tableData]
最终正确输出
[['apples', 'oranges', 'cherries', 'banana', ''], ['Alice', 'Bob', 'Carol', 'David', 'Katherine'], ['dogs', 'cats', 'moose', 'goose', '']]
内容的提问来源于stack exchange,提问作者Surya Kannan
相关产品推荐
相关产品推荐

