首页 > 解决方案 > 我一次追加到列表中的每个项目,而不是一次一个,字符图片网格

问题描述

我在 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

非常感谢您的参与。这是我的第一个问题。

标签: python

解决方案


问题的关键在于这两行:

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)

编辑:修正错别字


推荐阅读