[英]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.