问题出在ATBS的第6章。它将创建一个传递一个列表列表的函数,然后打印每个列表,但将其对齐以使每一列都整齐并齐平,而不管列表中字符串的长度如何。
我创建了一个空列表,其元素数量与每个嵌入列表相同(假定长度相同),并找到了每个列表中的最大字符串长度,并将此数字添加到了空列表中。然后调用以打印以最大字符串长度为理由的每个列表。
SELECT * FROM PROD A JOIN PROD B ON A.PROD-Project = B.PROD-Project WHERE B.PROD-Status = 'B'
这将打印以下
table = [['Tom','Dick','Harry','John'],
['Apples','Oranges','Strawberries','Grapes'],
['Brocolli', 'Asparagus', 'Carrots', 'Potatoes']]
def printTable(tableData):
colWidths = [0] * len(tableData)
for i in range(len(tableData)):
colWidths[i] = max(len(j) for j in tableData[i])
for i in range(len(tableData)):
for j in tableData[i]:
print(j.rjust(colWidths[i]))
printTable(table)
但是我希望它在三个单独的列中,而不是一列。我知道这可以简单地用zip完成,但我还没有介绍。我想了解如何在覆盖新内容之前使用for循环来完成工作,因为我认为这样做不会帮助我正确地学习基础知识。
答案 0 :(得分:1)
尝试一下:
table = [['Tom','Dick','Harry','John'],
['Apples','Oranges','Strawberries','Grapes'],
['Brocolli', 'Asparagus', 'Carrots', 'Potatoes']]
def printTable(tableData):
colWidths = [0] * len(tableData)
for i in range(len(tableData)):
colWidths[i] = max(len(j) for j in tableData[i])
for i in range(len(tableData)):
for j in tableData[i]:
print(j.rjust(sum(colWidths[:i+1])))
printTable(table)
我所做的就是更改rjust
,以证明不仅适用于当前列,而且适用于所有先前列。
好东西,您已经将所有宽度都放在列表中了:)
答案 1 :(得分:0)
这是开始的事情:第一行(之所以称为row0
,因为它是索引为0的那一行)是
row0 = [x[0] for x in table]
对于表中的每个列表x
,您都采用第一个元素。
类似地构造第二行。
要获取所有行,请将其放入循环for i in range(4)
请注意,如果table
中的一个元素的长度不同,则必须以某种方式进行处理,但是在您的示例中,table
中的所有元素都具有相同的长度4
答案 2 :(得分:0)
table = [['Tom','Dick','Harry','John'],
['Apples','Oranges','Strawberries','Grapes'],
['Brocolli', 'Asparagus', 'Carrots', 'Potatoes']]
def printTable(tableData):
buffer = []
colWidths = [0] * len(tableData)
for i in range(len(tableData)):
colWidths[i] = max(len(j) for j in tableData[i])
for j in range(len(tableData[i])):
buffer.append("") #filling the buffer array with empty string could have used buffer = ["" for i in range(len(tableData[i]]))]
for i in range(len(tableData)):
for j in range(len(tableData[i])):
buffer[j] += (tableData[i][j].rjust(colWidths[i]))
buffer[j] += " "
for i in range(len(buffer)):
print(buffer[i])
printTable(table)
我所做的就是定义一个缓冲区数组来存储每一行,然后,我创建了另一个for循环来打印它们。当您打印一行时,您无法返回该行并添加新元素,因此您必须先创建要打印的行,然后再打印。由于您想要的输出在每个列表中都有一个项目,因此我将它们串联为一个字符串,并用空格分隔。
输出为
Tom Apples Brocolli
Dick Oranges Asparagus
Harry Strawberries Carrots
John Grapes Potatoes