我正在尝试编写一个函数,该函数接受一维列表 li
并将其转换为 10 列 X 行的二维列表。 (li
的长度保证可以被 10 整除。)该函数会将输入的 li
中的元素复制到输出中,以填充二维列表的第一列一直填充,然后一直填充第二列,依此类推,直到复制了 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”时覆盖它。我不明白为什么代码要这样做!感谢所有帮助!
最佳答案
当您“乘以”一个列表时,它会复制对象引用,而不是底层对象。因此,外部列表的每一行实际上都在引用同一个内部列表对象。
result = [[" "] * 10] * rows
要为每一行创建一个新列表,您可以执行以下操作:
result = [[" "] * 10 for _ in range(rows)]
注意:如果使用 Python 2,请使用 xrange
而不是 range
。
关于python - 用嵌套循环填充二维列表会跳过并在 python 中意外地重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54760424/