zoukankan      html  css  js  c++  java
  • python对齐输出

    这个问题烦恼了挺久,一般情况下我都是用 解决,但其实这样的办法并不是很nice,然后今天在写一个demo的时候实在看不下去,就百度科普了一波,确实是有比较nice的解决方案。

    像这样:

     

    令人十分难受啊!

    #-------------------------------------------------------------------------------------------------

    在此之前先说一下python中的.format格式化输出

    python2.6开始,可以使用str.format进行轻松的格式化,

    如上可以看到,对变量的处理简洁灵活,此外对数字的各种位数处理也很到位

    {:<x}的语法表示左对齐(>为右对齐,^为居中),少于x位自动补齐(默认为空格补齐)

    这里值得注意的是,x也可以作为变量代入:

     

    #-----------------------------------------------------------------------------------------------------

    着手解决问题,

    第一反应使用 制表符,带来的问题便是字符串长度差距超过一个制表位时,会跳到下一个制表位,如图:

    不能接受,使用str.format补齐name属性的长度为25

    结果却是这样的:

      

    py虽好,有些细节还是没有照顾到中文

    这里补齐长度时中文字符也按1字节计算了,

    然而我们知道,utf-8中中文占用3个字节,GBK中占用了2个字节,只算作1字节显然不能对齐

    这时求助于prettytable包输出表格,然而输出也不理想,可以想象也没有考虑中文编码的问题(或是需要设置编码为utf-8或gbk?)

    分析一下理想的name所占的长度,应为固定的x字节(这里按目前的爬取结果暂时取22)

    那么他的补齐长度应为

    len = 22 - gbk编码下name的字节数 + name的字符数

    幸运的是str.format支持使用变量代替补齐长度的值

    尝试以下代码:

    print('[{name:<{len}}x'.format(name=name+']',len=22-len(name.encode('GBK'))+len(name)))

    结果十分接近理想了:

    还是有一些迷之问题导致1-0.5字节长度的偏差,猜测是由于中文字体不是等宽字体的缘故?

    然而不用多虑,这里就可以使用一记粗暴的制表符 解决问题了

    print('[{name:<{len}}	x'.format(name=name+']',len=22-len(name.encode('GBK'))+len(name)))

    大功告成!

  • 相关阅读:
    leetcode 43. 字符串相乘
    leetcode 20. 有效的括号 (python)
    leetcode 125. 验证回文串(python)
    leetcode 171. Excel表列序号(python)
    leetcode 190. 颠倒二进制位(c++)
    leetcode 122. 买卖股票的最佳时机 II (python)
    leetcode 118. 杨辉三角(python)
    leetcode 141. 环形链表(C++)
    leetcode 189. 旋转数组(python)
    leetcode 217. 存在重复元素 (python)
  • 原文地址:https://www.cnblogs.com/nul1/p/11136495.html
Copyright © 2011-2022 走看看