如何打印带有对齐文本的列表列表,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)))

同样,没有 mapzip,工作量更大:

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

我不确定在不使用语言提供给你的情况下尝试解决问题(比如 mapzip)是个好主意 - 除非有人试图给你上一课它们的用处或如何编写循环。但是,你可能不应该在这里问...

今天试过这个问题。显然 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)