首页 > 解决方案 > 用嵌套循环填充二维列表会在python中意外跳过并重复值

问题描述

我正在尝试编写一个函数,该函数接收一维列表li并将其转换为 10 列和 X 行的二维列表。(保证 的长度li可以被 10 整除。)该函数会将元素从输入复制li到输出,以便一直填充 2D 列表的第一列,然后一直填充第二列,依此类推直到它复制了所有元素li

这是我想要的输入和输出的示例:

输入:

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']

输出:

[['A', 'C', 'E', 'G', 'I', 'K', 'M', 'O', 'Q', 'S'], 
 ['B', 'D', 'F', 'H', 'J', 'L', 'N', 'P', 'R', 'T']]

这是我的代码:

def transform(li) :
rows = int(len(li) / 10)
result = [[" "] * 10] * rows

for col in range(10) :
    for row in range(rows) :
        result[row][col] = li.pop(0)

return result

并给出与上面相同的输入,这是它输出的内容:

[['B', 'D', 'F', 'H', 'J', 'L', 'N', 'P', 'R', 'T'], 
 ['B', 'D', 'F', 'H', 'J', 'L', 'N', 'P', 'R', 'T']]

在使用 print 语句尝试和调试之后,它似乎是一次分配整个列。因此,它将第一列中的两行都分配给“A”,然后在将它们都分配给“B”时覆盖。我不明白为什么代码会这样做!感谢所有帮助!

标签: python

解决方案


当您“乘以”列表时,它会复制对象引用,而不是底层对象。所以外部列表的每一行实际上都引用了同一个内部列表对象。

result = [[" "] * 10] * rows

要为每一行创建一个新列表,您可以执行以下操作:

result = [[" "] * 10 for _ in range(rows)]

注意:如果使用 Python 2 ,请使用xrange而不是。range


推荐阅读