用Python自动化无聊的东西,第4章Exercis

2024-05-26 21:51:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新手,现在正在写艾尔·斯威格的书。在第四章的练习中,他问了如下问题:

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

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

可以将网格[x][y]看作是绘制的“图片”的x和y坐标处的字符 带有文本字符。(0,0)原点将在左上角 拐角处,x坐标向右增加,w y坐标上升向下。复制上一个网格值,然后 编写使用它打印图像的代码。

..OO.OO.. 
.OOOOOOO. 
.OOOOOOO. 
..OOOOO.. 
...OOO... 
....O....

所以我已经写了代码,它做了他要求的,但我认为它写得很糟糕,我想问你我如何改进它。我的密码

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)

程序输出:

..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....

Tags: in列表forlenrangegridoostr
3条回答
>>> print('\n'.join(map(''.join, zip(*grid))))
..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....

zip(*grid)有效地转置矩阵(在主对角线上翻转矩阵),然后将每一行连接成一个字符串,然后用换行符将这些行连接起来,这样就可以立即打印整个内容。

我也是一个新手-只使用书中提到的内容,并记住循环中的循环提示,这是我的答案:

for j in range(len(grid[0])):
    for i in range(len(grid)):
        print(grid[i][j],end='')
    print('')

我有另一个简单的解决方案,与其他只用于循环的解决方案非常相似。但有一件事我似乎做了不同的是,我使用了两个增广运算符,一个在内部循环,一个在外部循环。我想在弄清楚我们的要求后会有用的。

print(grid[0][0],
      grid[1][0],
      grid[2][0],
      grid[3][0],
      grid[4][0],
      grid[5][0],
      grid[6][0],
      grid[7][0],
      grid[8][0])

打印报表输出:

. . O O . O O . .

如你所见,这是心脏网格的第一行。我们需要从0计数到len(网格[0]),这是第一个列表中的项目数,您也可以键入6。所以,我只需要两个操作员互相计数。空的print语句用于换行。如果不使用它,它会打印出同一行上的所有字符,或者每行上的每个字符。

解决方案:

def printer(grid):
    for m in range(len(grid[0])):
        print()
        for n in range(len(grid)):
            print (grid[n][m],end="")
            n+=1        
    m+=1

输出:

..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....

相关问题 更多 >

    热门问题