在嵌套列表中填充列表以使所有列表的长度一致

Padding lists inside nested list to make all of uniform length

提问人:Surya Kannan 提问时间:2/26/2023 最后编辑:Mathpdegeek497Surya Kannan 更新时间:2/26/2023 访问量:139

问:

我正在尝试解决一个问题,即给定一个包含可变大小列表的嵌套列表,创建一个嵌套列表,该列表包含均匀长度等于给定嵌套列表中列表中最大长度的列表。追加空字符串作为填充。

输入列表:

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David','Katherine'],
             ['dogs', 'cats', 'moose', 'goose']]

这是我制作的列表,其中宽度是所有子列表中的最大值:

    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', '']]
Python for 循环 嵌套列表

评论


答:

0赞 Codist 2/26/2023 #1

查找子列表的最大长度。遍历子列表并相应地扩展它们:

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David','Katherine'],
             ['dogs', 'cats', 'moose', 'goose']]

_max = max(map(len, tableData))

for e in tableData:
    e.extend([''] * (_max - len(e)))

print(tableData)

输出:

[['apples', 'oranges', 'cherries', 'banana', ''], ['Alice', 'Bob', 'Carol', 'David', 'Katherine'], ['dogs', 'cats', 'moose', 'goose', '']]
0赞 Mathpdegeek497 2/26/2023 #2

我会告诉你更好的方法。通读完整答案以了解代码和过程。我不会使用比您提供的代码片段中使用的函数更多的函数。 假设输入嵌套列表为

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David','Katherine'],
             ['dogs', 'cats', 'moose', 'goose']]

现在,让我们循环访问此嵌套列表,以查找此嵌套列表中列表的最大长度。

max_length = 0
for inside_list in tableData:
    if len(inside_list) > max_length:
        max_length = len(inside_list)

输出5

现在,只需遍历 tableData 中的列表,并找出它们比最大值短的程度。然后多次附加空字符串以将它们填充到均匀的长度。

for inside_list in tableData:
    shorter = max_length - len(inside_list)
    for i in range(shorter)
        inside_list.append("")

运行此操作将创建最终列表,如下所示

tableData = [['apples', 'oranges', 'cherries', 'banana', ''],
             ['Alice', 'Bob', 'Carol', 'David', 'Katherine'],
             ['dogs', 'cats', 'moose', 'goose', '']]

评论

0赞 Surya Kannan 2/26/2023
谢谢。是的,最初的问题是向输入列表添加填充,但在尝试解决这个问题时,我发现我无法将值从列表复制到列表。有没有办法做到这一点?我尝试了嵌套的 for 循环,但它给了我帖子中提到的输出。
0赞 Mathpdegeek497 2/27/2023
为什么不能将值从一个列表复制到另一个列表?有几种方法,如切片,以及 python 中的深拷贝/浅拷贝概念来复制列表。你能更具体地说一下你不能做什么吗?
0赞 Surya Kannan 2/27/2023
我应该说覆盖而不是复制。我想从嵌套列表中获取值,并将它们插入到我已经在相同索引中创建的嵌套列表中。
0赞 Mathpdegeek497 2/27/2023
@SuryaKannan,我需要您用来执行此操作的代码。对我来说,这是一个非常简单的过程,我无法弄清楚你做错了什么。
0赞 Surya Kannan 2/27/2023
我不能在这里发布代码,但是在帖子中输出之前的最后一个代码片段是我正在尝试做的。 帖子中的输出就是我得到的。我试图从输入列表中获取值并插入到创建的列表中的相同索引中,但所有子列表都会同时被覆盖,如帖子中的输出所示,而不是一个接一个。