python - 用嵌套循环填充二维列表会跳过并在 python 中意外地重复值

标签 python

我正在尝试编写一个函数,该函数接受一维列表 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/

相关文章:

python - 如何动态更新Python循环中参数的值?

python - 如何获取有关特定 Dask 任务的信息

类似于 R 中的 %in% 的 Python 运算符

python - python 中的迭代二分搜索

python - 为什么此 ctypes 代码不能与 Python 3.3 一起使用,但可以与 Python 2.7 一起使用?

python - 无法弄清楚为什么这个 xpath 选择器不起作用

python - Python 3 中的最大元组数组大小是多少?

使用 pyPDF 删除空白页的 Python 脚本

python key() 错误

python - tkinter Canvas 文本输出