python - 用嵌套循环填充二维列表会在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”时覆盖。我不明白为什么代码会这样做!感谢所有帮助!
解决方案
当您“乘以”列表时,它会复制对象引用,而不是底层对象。所以外部列表的每一行实际上都引用了同一个内部列表对象。
result = [[" "] * 10] * rows
要为每一行创建一个新列表,您可以执行以下操作:
result = [[" "] * 10 for _ in range(rows)]
注意:如果使用 Python 2 ,请使用xrange
而不是。range
推荐阅读
- reactjs - 如何在 SSR 项目中生成唯一 ID (Next.js)
- javascript - 隐藏和显示表格中的行
- python - 用 sympy 在 python 中求解方程
- java - 如何使用 thymeleaf th:each 将超链接添加到表的列?
- c++ - 如何过滤出结果以仅获取输出结果中的文件名linux在c ++ 98中
- apache-spark - 在 Hive CLI 上执行“alter table table_name drop partition(part_column < value)”时出现空指针错误
- c++ - 在 C++ 中抛出 'std::out_of_range' 的实例后调用终止
- actionscript-3 - (actionscript 3) 如何创建模拟特定键盘输入的虚拟键
- c++ - 为 macOS-x86_64 构建,但尝试链接为 macOS-arm64 构建的文件
- ios - SwiftUI:如何让用户通过选项“light”、“dark”和“system”实时设置应用程序外观?