繁体   English   中英

使用 Python 自动化无聊的事情,第 4 章练习

[英]Automate the Boring Stuff With Python, Chapter 4 Exercise

我是新手,目前正在写 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', '.', '.', '.'],
         ['.', '.', '.', '.', '.', '.']] 

您可以将 grid[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....

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

for j in range(len(grid[0])):
    for i in range(len(grid)):
        print(grid[i][j],end='')
    print('')
>>> print('\n'.join(map(''.join, zip(*grid))))
..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....

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

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

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])

打印语句的输出:

. . 哦。 哦。 .

如您所见,它是心形网格的第一行。 我们需要0 数len(grid[0]) ,-这是第一个列表中的项目数,您也可以只输入 6。 所以,我所需要的只是两个相互计数的运算符。 空的打印语句用于换行。 如果我们不使用它,它要么打印出同一行上的所有字符,要么打印出每行上的每个字符。

解决方案:

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

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

只使用了我在前几章中学到的信息。 我确实很欣赏针对同一问题阅读更高级的技术。

解决问题的一种方法(根据书中的提示)是定义行和列。 给定的列表有 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()

作者说在循环中使用循环。 这是我的回答:

def reformat(myList):
    for i in range(0,len(myList[0])):
        myStr = ''
        for j in range(0,(len(myList))):
            myStr += myList[j][i]           
        print(myStr)
def heart():
    #Set your range to the length of the first list in grid.
    for y in range(len(grid[0])):
        #This print('') will break every printed line once the second for loop completes below.
        print('')
        #Set your second for loop to the length of the number of lists within grid.
        for x in range(len(grid)):
            #Add an end keyword arg to allow for consecutive str prints without new lines.
            print(grid[x][y],end='')
heart()

def heart():
    for y in range(len(grid[0])):
    print('')
        for x in range(len(grid)):
             print(grid[x][y],end='')
heart()

^ 没有注释的代码。

想想 Al 要求的模式。 [0][0],[0][1],[0][2]...[8][0],[8][1],[8][2]。 因此,您基本上希望第一个 for 指示从哪个列表中提取数据,然后在其中选择一个 for 来选择要打印的索引。 end 关键字 arg 也很重要。

简单的方法:

for i in range(len(grid[1])):
    for row in grid:
        print (row[i], end='')
    print()
    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', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

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

不错的解决方案! 我不太习惯使用 map()。 关于练习,我给自己设定了一个挑战,将网格翻转 90 度。

首先,它创建一个网格,该网格的列表数量与原始网格中单个列表的长度相同(以获取 x 轴)。 然后它将原始网格的每个列表的第一个(或第 n 个)元素附加到新网格的第一个(或第 n 个)列表中,并打印出新网格的每一行。

它可以用更少的代码行完成,但这里是:

def character_picture_grid(x):
"""The character_picture _grid print a grid list
with list(9 x 6) and rotates it 90-degrees."""

# Flip the grid.
newGrid = [[] for i in range(len(x[0]))]
for i in range(len(newGrid)):
    for a in range(len(x)):
        newGrid[i].append(x[a][i])

# Print the grid
for i in newGrid:
    print(i)

编辑:语法。

重要的是要记住,练习的想法是用你在本章之前学到的知识来解决它,所以在循环中使用循环的一种方法是:

def grilla(x):
    for y in range(6):
        print()
        for i in range(len(x)):
            print(x[i][y], end='')
grilla(grid)

嘿伙计们,我是 Python 新手,这是我的答案。

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

我还从作者那里得到了在循环中使用循环的提示。 所以我实际上只是使用了 while 和 for 循环的组合。 这是我的代码:

#First I copied the grid as the author instructs

grid = [['.','.','.','.','.','.'],
       ['.','0','0','.','.','.'],
       ['0','0','0','0','.','.'],
       ['0','0','0','0','0','.'],
       ['.','0','0','0','0','0'],
       ['0','0','0','0','0','.'],
       ['0','0','0','0','.','.'],
       ['.','0','0','.','.','.'],
       ['.','.','.','.','.','.']]

# I set two global variables x and y. I will use x to iterate through 
# the while loop and y to increment the index in the inner list
x = 0
y = 0

# set the condition for the while loop to limit it to the length of the list
# and also to limit it to the length of the inner list which doesn't exceed index 5 

while x < len(grid) and y <= 5:
   for item in range(len(grid)):
        print(grid[item][y], end='')

    y += 1 # increment y after iteration of a for loop 
    print('') # print blank line
    x += 1 # increment x after iteration of for loop go through for loop again

输出

..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....         

你甚至可以这样做

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

    print()

我的尝试,也是结合 for 和 while。 不像以前的答案那么漂亮,但对我来说仍然足够好。

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=0 #counter
y=0 #counter

for y in range(len(grid[x])): #for each y in sublists
    new_str=""                  #create temporary new string to house the sublists
    while x <= len(grid)-1:     #for each x in list
        new_str += grid[x][y]   
        x+=1                    #add every x in a string while keeping y steady
    print(new_str)              #print string of x's while y steady
    x=0                         #set x to 0 in order to start again on next iteration of y
for j in range(len(grid[:6])):
  # print(grid[0][j]) 
    for i in range(len(grid)):
        print(grid[i][j], end='')
    print()

注释掉的部分在第一行打印了一个单点。 O 数字本身是正确的,第一列上缺少其他一些点。

我也是新手,我只使用了书中介绍的内容。 这是我的代码。

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

这是我的回答:

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

for i in range(len(grid[0])):
    col=[col[i] for col in grid]
    print(*col, sep='')

同样是python的新手,我的回答如下,它有效。

for i in range(0,6,1):
    for j in range(0,8,1):     
        print(grid[j][i], end='')
    print('')
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', '.', '.', '.'],
    ['.', '.', '.', '.', '.', '.']]

def love_grid(name):

    xyz = int(len(list(name)) - 1)

    for a in range(0, len(list(name))):

        print(name[a][0], end="")
        if a == xyz:
            print()
            break

    for a in range(0, len(list(name))):

        print(name[a][1], end="")
        if a == xyz:
           print()
           break

    for a in range(0, len(list(name))):

        print(name[a][2], end="")
        if a == xyz:
            print()
            break

   for a in range(0, len(list(name))):

        print(name[a][3], end="")
        if a == xyz:
            print()
            break

   for a in range(0, len(list(name))):

        print(name[a][4], end="")
        if a == xyz:
           print()
           break

   for a in range(0, len(list(name))):

       print(name[a][5], end="")
        if a == xyz:
           print()
           break



love_grid(grid)
def grid(l):
    for i in range(len(l)):
        print('')

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

这也照顾逗号。

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

count = 0
while count < len(grid):
    print()
    try:
        for x in range(len(grid)):
            print(grid[x][count], end='')
    except IndexError:
        break

    count += 1

我刚开始读这本书,这就是我想到的,看起来很简单。

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


def final(grid_solve, count):
    empty = ""
    for i in grid_solve:
        empty += i[count]

    return empty


total = 0

while total != len(grid[0]):
    print(final(grid, total))
    total += 1

输出:

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

我是新手,目前正在写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', '.', '.', '.'],
         ['.', '.', '.', '.', '.', '.']] 

您可以将grid [x] [y]视为用文字字符绘制的“图片”的x坐标和y坐标处的字符。 (0,0)原点将在左上角,x坐标向右增加,而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....
for x in range (0,6):
    for y in range (0,9):
        print (grid[y][x], end='')
    print ('')
b=len(grid)  
for y in range(b-3):  
    print('\n')  
    for x in range(b):  
        print(grid[x][y], end=' ')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM