python - 我一次追加到列表中的每个项目,而不是一次一个,字符图片网格
问题描述
我在 Automate the Boring Stuff with Python 中练习了 Character Picture Grid 练习。并假设将列表网格旋转 90 度。我理解它的逻辑和过程。
grid = [['.', '.', '.', '.', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['O', 'O', 'O', 'O', 'O', '.'],
['.', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['.', '.', '.', '.', '.', '.']]
理想的输出看起来像这样。
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.']
['.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.']
['.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.']
['.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.']
['.', '.', '.', 'O', 'O', 'O', '.', '.', '.']
['.', '.', '.', '.', 'O', '.', '.', '.', '.']
所以我打算准备一个包含 6 个项目(6 个空白列表)的新列表,然后从原始列表(网格)中附加值来旋转它。但是从我的以下代码中,该函数一次追加到新列表的每个项目中,而不是按 for 循环的顺序追加列表。
def transpose(heart):
outcome = []
row = []
for i in range(len(heart[0])):
outcome = outcome + [row]
for i in range(len(outcome)):
for y in range(len(heart)):
outcome[i].append(heart[y][i])
for i in outcome:
print(i)
输出
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', '.', '.', 'O', 'O', 'O', '.', '.', '.', '.', '.', '.', '.', 'O', '.', '.', '.', '.']
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', '.', '.', 'O', 'O', 'O', '.', '.', '.', '.', '.', '.', '.', 'O', '.', '.', '.', '.']
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', '.', '.', 'O', 'O', 'O', '.', '.', '.', '.', '.', '.', '.', 'O', '.', '.', '.', '.']
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', '.', '.', 'O', 'O', 'O', '.', '.', '.', '.', '.', '.', '.', 'O', '.', '.', '.', '.']
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', '.', '.', 'O', 'O', 'O', '.', '.', '.', '.', '.', '.', '.', 'O', '.', '.', '.', '.']
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.', '.', '.', '.', 'O', 'O', 'O', '.', '.', '.', '.', '.', '.', '.', 'O', '.', '.', '.', '.']
所以,我尝试了一种与评论不同的方式来创建一个新列表,然后开始旋转它,同时保持其他部分不变。然后这个给出正确的输出。
def transpose(heart):
outcome = [[] for i in range(len(heart[0]))]
for i in range(len(outcome)):
for y in range(len(heart)):
outcome[i].append(heart[y][i])
for i in outcome:
print(i)
为什么它们不同?因为这两种方式给出了相同的新列表。
#first way
outcome = [[] for i in range(len(grid[0]))]
#second way
outcome1 = []
row = []
for i in range(len(grid[0])):
outcome1 = outcome1 + [row]
outcome == outcome1
True
非常感谢您的参与。这是我的第一个问题。
解决方案
问题的关键在于这两行:
def transpose(heart):
outcome = []
row = [] # <- Key1
for i in range(len(heart[0])):
outcome = outcome + [row] # <- Key2
for i in range(len(outcome)):
for y in range(len(heart)):
outcome[i].append(heart[y][i])
for i in outcome:
print(i)
您在“Key 2”行中创建的是对名为 row 的列表的引用列表。因此,每当您在列表“结果”的任何项目上调用 append 时,“行”列表都会附加一个新项目。这就是输出不好的原因。在第二个示例中,您将“结果”的每个项目初始化为不同的空列表
要更清楚地查看错误,您可以运行以下代码:
outcome = []
row = ["Hello! I'm the row list",]
for i in range(5):
outcome = outcome + [row]
print(outcome)
解决它的一种简单方法是用空列表替换行
outcome = []
for i in range(5):
outcome = outcome + [[]]
outcome[0].append('I am The first item')
outcome[2].append('I am The Third item')
print(outcome)
编辑:修正错别字
推荐阅读
- apache-nifi - 如何使用java前端设置处理器(Nifi)的动态属性
- java - 最近在 Java 中获取文件大小的方法
- r - 两个 y 轴 ggplot 未正确显示
- angular - 如何更新使用 of(myArray) 创建的 RxJS Observable 的值
- excel - 采用列 VBA 的模式
- azure-sql-database - 使用具有父子数据集关系的 Power BI 交互式可视化
- c - C中函数的复杂性
- ansible - Ansible 从其他组 vars 向 ansible vault 询问密码
- c# - 在 C# 运行时查找对象的所有引用/声明 | 结构图
- cassandra-3.0 - ReadTimeout:来自服务器的错误:代码 = 1200 [协调节点超时等待副本节点