如何打印带有对齐文本的列表列表,rjust() 的整数长度来自列表中字符串的最大长度。
How to print list of lists with justified text, the integer length to rjust() comes from the largest length of string in the lists.
我试图找到答案,但大多数答案都使用高级函数,如 map() 或 zip()。我必须只使用字符串属性、方法或函数。我找不到字符串函数或属性的答案。
我需要将给定的列表打印到右对齐的列中。它是每个子列表的一种转置,即列表列表中的第一个列表打印为 table 的第一列,第二个列表第二列,依此类推。
给定的列表列表:
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
和所需的输出:
注意 rjust() 的参数来自 tableData 中最长单词的最大长度。
我计算出table数据中最长单词的最大整数长度如下:
colWidths=[]
for i in range(len(tableData)):
maxL=len(max(tableData[i], key=len))
colWidths.append(maxL)
max(colWidths)
现在我不知道如何编写一个循环来打印所需 table 格式的列表。 (我可以使用 zip() 或 map() 来完成,但那不被接受!)有帮助吗?
如果您不想转置 table,您可以采用肮脏的方式:
for column in range(4):
for row in range(3):
print(tableData[row][column].rjust(10), end='')
print('')
Column/row 范围可以动态设置,如果您的任务需要的话
一个衬垫达到最大长度:
max_len = max(map(max, [map(len, l) for l in tableData]))
但是如果你被阻止使用map
,这就更简单了:
max_len = 0
for l in tableData:
for s in l:
max_len = max(max_len, len(s))
并打印table,主要问题是table需要先转置:
printTableData = list(map(list, zip(*tableData)))
同样,没有 map
或 zip
,工作量更大:
max_col_len = 0
for l in tableData:
max_col_len = max(max_col_len, len(l))
printTableData2 = [[] for _ in range(max_col_len)]
for i in range(max_col_len):
for j in range(len(tableData)):
if i <= len(tableData[j]):
printTableData2[i].append(tableData[j][i])
else:
printTableData2[i].append('')
并打印整个内容:
for l in printTableData:
for s in l:
sys.stdout.write(s.rjust(max_len+1))
sys.stdout.write('\n')
请注意,这并不是您所需要的,因为您提供的图像的每一列都分别进行了右调整。所以,作为一个完整的解决方案:
import sys
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
max_lens = []
max_col_len = 0
for l in tableData:
max_col_len = max(max_col_len, len(l))
max_len = 0
for s in l:
max_len = max(max_len, len(s))
max_lens.append(max_len)
printTableData = [[] for _ in range(max_col_len)]
for i in range(max_col_len):
for j in range(len(tableData)):
if i <= len(tableData[j]):
printTableData[i].append(tableData[j][i])
else:
printTableData[i].append('')
for l in printTableData:
for i in range(len(l)):
sys.stdout.write(l[i].rjust(max_lens[i]+1))
sys.stdout.write('\n')
我不确定在不使用语言提供给你的情况下尝试解决问题(比如 map
和 zip
)是个好主意 - 除非有人试图给你上一课它们的用处或如何编写循环。但是,你可能不应该在这里问...
今天试过这个问题。显然 post 不再活跃了,仍然把我的解决方案放在这里。
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
def printTable(table):
for j in range(len(table[0])):
for i in range(len(table)):
length = len(max(tuple(table[i]),key=len))
print(table[i][j].rjust(length), end=' ')
print()
printTable(tableData)
我试图找到答案,但大多数答案都使用高级函数,如 map() 或 zip()。我必须只使用字符串属性、方法或函数。我找不到字符串函数或属性的答案。
我需要将给定的列表打印到右对齐的列中。它是每个子列表的一种转置,即列表列表中的第一个列表打印为 table 的第一列,第二个列表第二列,依此类推。
给定的列表列表:
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
和所需的输出:
注意 rjust() 的参数来自 tableData 中最长单词的最大长度。
我计算出table数据中最长单词的最大整数长度如下:
colWidths=[]
for i in range(len(tableData)):
maxL=len(max(tableData[i], key=len))
colWidths.append(maxL)
max(colWidths)
现在我不知道如何编写一个循环来打印所需 table 格式的列表。 (我可以使用 zip() 或 map() 来完成,但那不被接受!)有帮助吗?
如果您不想转置 table,您可以采用肮脏的方式:
for column in range(4):
for row in range(3):
print(tableData[row][column].rjust(10), end='')
print('')
Column/row 范围可以动态设置,如果您的任务需要的话
一个衬垫达到最大长度:
max_len = max(map(max, [map(len, l) for l in tableData]))
但是如果你被阻止使用map
,这就更简单了:
max_len = 0
for l in tableData:
for s in l:
max_len = max(max_len, len(s))
并打印table,主要问题是table需要先转置:
printTableData = list(map(list, zip(*tableData)))
同样,没有 map
或 zip
,工作量更大:
max_col_len = 0
for l in tableData:
max_col_len = max(max_col_len, len(l))
printTableData2 = [[] for _ in range(max_col_len)]
for i in range(max_col_len):
for j in range(len(tableData)):
if i <= len(tableData[j]):
printTableData2[i].append(tableData[j][i])
else:
printTableData2[i].append('')
并打印整个内容:
for l in printTableData:
for s in l:
sys.stdout.write(s.rjust(max_len+1))
sys.stdout.write('\n')
请注意,这并不是您所需要的,因为您提供的图像的每一列都分别进行了右调整。所以,作为一个完整的解决方案:
import sys
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
max_lens = []
max_col_len = 0
for l in tableData:
max_col_len = max(max_col_len, len(l))
max_len = 0
for s in l:
max_len = max(max_len, len(s))
max_lens.append(max_len)
printTableData = [[] for _ in range(max_col_len)]
for i in range(max_col_len):
for j in range(len(tableData)):
if i <= len(tableData[j]):
printTableData[i].append(tableData[j][i])
else:
printTableData[i].append('')
for l in printTableData:
for i in range(len(l)):
sys.stdout.write(l[i].rjust(max_lens[i]+1))
sys.stdout.write('\n')
我不确定在不使用语言提供给你的情况下尝试解决问题(比如 map
和 zip
)是个好主意 - 除非有人试图给你上一课它们的用处或如何编写循环。但是,你可能不应该在这里问...
今天试过这个问题。显然 post 不再活跃了,仍然把我的解决方案放在这里。
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
def printTable(table):
for j in range(len(table[0])):
for i in range(len(table)):
length = len(max(tuple(table[i]),key=len))
print(table[i][j].rjust(length), end=' ')
print()
printTable(tableData)