手搓python对齐输出列表数据

python对齐打印数据

# coding=utf-8

def print_fmt(data_list, start=0, end=0):
    """

    :param data_list: 传入的 数据列表 type:[[],()...]
    :param start: 打印的开始列
    :param end: 打印的结束列
    :return: 无返回值(可以返回格式化好的列表)
    """
    data = data_list

    # 局部命名空间
    __var = locals()

    # 存储自定义变量,及其序号
    var_ds = []

    if end == 0 or end > len(data[0]):
        end = len(data[0])
    if start:
        # 将自然序号变为数据序号
        start = start - 1
    for i in range(start, end):
        # 生成变量名d0,d1,d2... 并保存到var_ds中 :d0 第0列的宽度
        # max(list(map(len, list(map(lambda x: str(x[i]), data))))) 求data列表中所有数组(列表)中第i个元素的最大长度 ,即打印时该列的宽度。
        __var['d' + str(i)] = max(list(map(len, list(map(lambda x: str(x[i]), data)))))
        var_ds.append((i, __var['d' + str(i)]))
    # 将文本格式化为指定宽度的函数
    fm = lambda x: format(x[0], '<%d' % x[1])

    # 将一个列表中的所有数据格式化,并用制表符将数据分隔,处理中文与英文不等长的问题
    fmt = lambda x: '\t| '.join(map(fm, map(lambda x1: (x[x1[0]], x1[1]), var_ds)))

    print('\n' + '*' * 33)
    for i in data:
        i = fmt(i)
        # 这里可以把 格式化后的i 存起来并返回
        print(i)
    print('*' * 33 + '\n')


if __name__ == '__main__':
    data = [
        ['asda', 'asd', 'a'],
        ['haoahah好', 'd', 123],
        ('asd', 'asd', '1')
    ]
    print_fmt(data)


(https://img-blog.csdnimg.cn/20210626103618360.png)

存在的BUG:
当且仅当该列中的元素最长的那行的同时存在中文和英文,且中文数量比其他行的中文数量多于3时,会造成对不齐的情况。

if __name__ == '__main__':

    data = [
        ['a好', 'asd', 'a','b'],
        ['a好好好好好好好', 'd', 123,'as'],
        ('好', 'asd', '1','asdasdas')
    ]
    print_fmt(data)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值