如何解决文本对齐

新手上路,请多包涵

大家好,我是python学习新手,我在一个练习题目中遇到问题.
题目的要求是把列表打印输出并对齐。
输入数据:

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

要求的输出数据(第一行右对齐,其他左对齐):

  apples Alice dogs
 oranges Bob   cats
cherries Carol moose
  banana David goose

以下是我的代码

"""下面是代码正文"""
tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

def printTable(tableData):
    # 下面是为了求每个内层列表的最长字符串的长度
    colWidths = [0] * len(tableData)
    for i in range(len(colWidths)):
        colWidths[i] = len(sorted(tableData[i], key=(lambda x: len(x)))[-1])
    
    for x in range(len(tableData[0])):
        for y in range(len(tableData)):
            print(tableData[y][x].rjust(colWidths[y]), end=' ')
        print('')    # 换行

printTable(tableData)

输出结果是(全部右对齐了):

  apples Alice  dogs 
 oranges   Bob  cats 
cherries Carol moose 
  banana David goose 

请问要怎么做才能达到题目要求的输出结果?

阅读 5.7k
2 个回答
tableData = [
    ['apples', 'oranges', 'cherries', 'banana'],
    ['Alice', 'Bob', 'Carol', 'David'],
    ['dogs', 'cats', 'moose', 'goose']
]

def print_table(data):
    col_width = [max(len(item) for item in col) for col in data]
    for row_idx in range(len(data[0])):
        for col_idx, col in enumerate(data):
            item = col[row_idx]
            align = '<' if not col_idx==0 else '>'
            print(('{:'+align+str(col_width[col_idx])+'}').format(item), end=' ')
        print()

print_table(tableData)

結果:

  apples Alice dogs  
 oranges Bob   cats  
cherries Carol moose 
  banana David goose

我回答過的問題: Python-QA

文本对齐的问题,可以使用 DebugInfo 模块来处理, 以下是就这个问题所示数据的解决代码:

# -*- coding:UTF-8 -*-
import os

# region 引入必要依赖
from DebugInfo.DebugInfo import *

# endregion

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

画板 = 调试模板()

画板.添加一行('水果', '人物', '宠物').修饰行(青字)
for 水果, 人物, 宠物 in zip(tableData[0], tableData[1], tableData[2]):
    画板.添加一行(水果, 人物, 宠物)

# 设置列对齐, 'r' 表示右对齐
画板.设置列对齐('r').展示表格()

以上代码输出效果如下:
image.png

事实上,DebugInfo还支持中英日韩文字字符串的对齐,如下:

# -*- coding:UTF-8 -*-
import os

# region 引入必要依赖
from DebugInfo.DebugInfo import *

# endregion

# 数据
tableData = [['apples', 'oranges橘子', 'cherries', 'banana', '橎桃'],
['Alice', 'Bob', 'Carol班长', 'David', '林 さゆり'],
['dogs', 'cats', 'moose', 'goose', '松狮']]

画板 = 调试模板()

画板.添加一行('水果', '人物', '宠物').修饰行(青字)
for 水果, 人物, 宠物 in zip(tableData[0], tableData[1], tableData[2]):
    画板.添加一行(水果, 人物, 宠物)

# 设置列对齐, 'r' 表示右对齐
画板.设置列对齐('r').展示表格()

以上代码打印效果如下:
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题