【问题标题】:How to print list of lists with justified text, the integer length to rjust() comes from the largest length of string in the lists.如何打印带有对齐文本的列表列表,rjust() 的整数长度来自列表中字符串的最大长度。
【发布时间】:2019-01-08 22:27:30
【问题描述】:

我试图找到答案,但大多数答案都使用 map() 或 zip() 等高级函数。我必须只使用字符串属性、方法或函数。我找不到字符串函数或属性的答案。

我需要将给定的列表列表打印到右对齐的列中。它是每个子列表的一种转置,即列表列表中的第一个列表打印为表格的第一列,第二个列表第二列,依此类推。

给定的列表列表:

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

和所需的输出:

请注意,rjust() 的参数来自 tableData 中最长单词的最大长度。

我已经算出tableData中最长单词的最大整数长度如下:

colWidths=[]
for i in range(len(tableData)):
    maxL=len(max(tableData[i], key=len))
    colWidths.append(maxL) 
max(colWidths)

现在我被困住了如何编写一个循环以所需的表格格式打印列表。 (我可以使用 zip() 或 map() 来做到这一点,但不被接受!)有什么帮助吗?

【问题讨论】:

  • 您是说不允许在解决方案中的任何地方使用map 或zip?或者只是不在产生输出的部分?
  • 是的,它不允许在任何地方使用它:)

标签: python python-3.x string string-operations right-justified


【解决方案1】:

如果你不想转置表格,你可以用肮脏的方式来做:

for column in range(4):
    for row in range(3):
        print(tableData[row][column].rjust(10), end='')
    print('')

如果您的任务需要,可以动态设置列/行范围

【讨论】:

  • 如果有 10 个 sub 列表,每个列表有 6 个项目怎么办?如果你不知道有多少个 sub-lists 或者它们包含多少项/
  • 完美,我进行了更新以使其对 cols、rows 和 rjust() 参数也具有动态性。谢谢:)
【解决方案2】:

获得最大长度的单行:

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

而要打印表格,主要问题是表格需要先转置:

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)的情况下尝试解决问题是个好主意 - 除非有人试图教您关于它们的有用性或如何解决问题的课程写循环。但是,你可能不应该在这里问......

【讨论】:

  • 您好,感谢您提供详细的解决方案。我想这只是为了稍后知道函数的价值;)
【解决方案3】:

今天试过这个问题。显然帖子不再活跃,仍然把我的解决方案放在这里。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多