使用Python自动化无聊的东西,第4章练习

Don*_*j10 7 python list

我是新手,现在正在做Al Sweigar的书.在第4章的练习中,他询问以下内容,

假设您有一个列表列表,其中内部列表中的每个值都是一个字符的字符串,如下所示:

 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', '.', '.', '.'],
         ['.', '.', '.', '.', '.', '.']] 
Run Code Online (Sandbox Code Playgroud)

您可以将grid [x] [y]视为使用文本字符绘制的"图片"的x和y坐标处的字符.(0,0)原点将在左上角,x坐标向右增加,而w坐标增加向下.复制上一个网格值,并编写使用它来打印图像的代码.

..OO.OO.. 
.OOOOOOO. 
.OOOOOOO. 
..OOOOO.. 
...OOO... 
....O....
Run Code Online (Sandbox Code Playgroud)

所以我已经编写了代码并且它完成了他要求的内容,但我认为它编写得非常糟糕,我想问你如何改进它.我的代码,

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', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

newString = ''

for i in range(len(grid)):
    newString += str(grid[i][0])

newString1 = '\n'
for i in range(len(grid)):
    newString1 += str(grid[i][1])

newString2 = '\n'
for i in range(len(grid)):
    newString2 += str(grid[i][2])

newString3 = '\n'
for i in range(len(grid)):
    newString3 += str(grid[i][3])

newString4 = '\n'
for i in range(len(grid)):
    newString4 += str(grid[i][4])

newString5 = '\n'
for i in range(len(grid)):
    newString5 += str(grid[i][5])

print(newString+newString1+newString2+newString3+newString4+newString5)
Run Code Online (Sandbox Code Playgroud)

计划产出:

..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....
Run Code Online (Sandbox Code Playgroud)

小智 18

我也是新手 - 仅使用本书所涵盖的内容,并记住循环提示中的循环,这是我的答案:

for j in range(len(grid[0])):
    for i in range(len(grid)):
        print(grid[i][j],end='')
    print('')
Run Code Online (Sandbox Code Playgroud)


Ste*_*ann 8

>>> print('\n'.join(map(''.join, zip(*grid))))
..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....
Run Code Online (Sandbox Code Playgroud)

zip(*grid)有效转置矩阵(翻转它的主对角线),则每一行被接合到一个字符串,则该行被用换行接合,从而整个事情可以一次打印.


小智 5

解决这个问题的一种方法(根据书中的提示)是定义行和列。给定列表有 9 行(列表的元素)和 6 列(每个元素的长度)。

显然,问题就变成了——

a) 打印第 1 行的所有列值 b) 打印第 2 行的所有列值...等等

一旦我们预先测量了要打印的行数和列数,这种方法就可以“标准化”

以下程序说明了执行此操作的一种方法 -

# This program illustrates the character picture grid


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', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

rows = len(grid) # Number of elements in the list
cols = len(grid[0]) # Number of elements in every single element in the list

for j in range(cols):
    for i in range(rows):
        print(grid[i][j], end='')
    print()
Run Code Online (Sandbox Code Playgroud)