V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pppguest3962
V2EX  ›  Python

dict 的内容,如何做简便的 print 输出格式化内容?

  •  
  •   pppguest3962 · 2018-08-28 15:52:07 +08:00 · 2543 次点击
    这是一个创建于 2278 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码贴过来会严重变形,简化了内容,伪代码式表达问题。。。, 例子:

    例子:
    makeData = {'D2_make_time':'32',
    			'D4_make_seq':'32',
    			'D16_make_zaijianum':'32',
    			'D2_make_time':'32',
    			'D9_make_carteam':'韵达',
    			'D11_make_goodteam':'A16'}
    

    一般输出:

                    print(('|生产日:' + makeData['D2_make_time'].strip()),
                           '|产 次:' + makeData['D4_make_seq'].strip(),
                           '|在架数:' + makeData['D16_make_zaijianum'].strip(),
                           '|车  队:' + makeData['D9_make_carteam'].strip(),
                           '|货  队:' + makeData['D11_make_goodteam'].strip())
    

    会这样:

    |生产日:32 |产 次:32 |在架数:32 |车  队:SASNCKJP |货  队:ECMCDJEH
    |生产日:32 |产 次:32 |在架数:32 |车  队:NAAKSE |货  队:ZKFGKFRTYKJJ
    |生产日:32 |产 次:32 |在架数:32 |车  队:XXMEWQOOPKMU |货  队:IRTYNVSSMY
    |生产日:32 |产 次:32 |在架数:32 |车  队:VBSKTHJNMM |货  队:DNFG
    |生产日:32 |产 次:32 |在架数:32 |车  队:AERKJUI |货  队:QMSCGNYR
    

    我想输出的比较规范一些,如果能长成这个样子就好了。。。

    |生产日:32 |产 次:32 |在架数:32 |车  队:SASNCKJP       |货  队:ECMCDJEH
    |生产日:32 |产 次:32 |在架数:32 |车  队:NAAKSE         |货  队:ZKFGKFRTYKJJ
    |生产日:32 |产 次:32 |在架数:32 |车  队:XXMEWQOOPKMU   |货  队:IRTYNVSSMY
    |生产日:32 |产 次:32 |在架数:32 |车  队:VBSKTHJNMM     |货  队:DNFG
    |生产日:32 |产 次:32 |在架数:32 |车  队:AERKJUI        |货  队:QMSCGNYR
    

    我试过:

                    a = makeData['D2_make_time'].strip()                
                    print(('|生产日:' + {}).format(a),
                           '|产 次:' + makeData['D4_make_seq'].strip(),
                           '|在架数:' + makeData['D16_make_rangqiu'].strip(),
                           '|车  队:' + makeData['D9_make_hometeam'].strip(),
                           '|货  队:' + makeData['D11_make_visiteam'].strip())
    

    pccharm 会提示 format()只接受 str 类型,而不接受 dict 类型,那么也没必要再试%s 的 print 方法了吧?

    15 条回复    2018-08-29 16:26:35 +08:00
    chenqh
        1
    chenqh  
       2018-08-28 15:59:14 +08:00
    fill?
    zhusimaji
        3
    zhusimaji  
       2018-08-28 16:17:30 +08:00
    pprint 了解下
    746970179
        4
    746970179  
       2018-08-28 16:23:11 +08:00   ❤️ 1
    对于字符串, 可以使用 ljust 方法, 这个方法进行左对齐, 同时用空格补齐剩下的空位
    比如'abc'.ljust(5), 得到的就是 'abc ' , 后面有 2 个空格

    还有你的代码格式, 可以这样
    makeData = {
    'D2_make_time':'32',
    'D4_make_seq':'32',
    'D16_make_zaijianum':'32',
    'D2_make_time':'32',
    }

    当一行写不完的时候, 左括号后面不要写代码, 直接换行
    优点的话, 主要是方便. 因为直接写代码, 下面几行的缩进, 不一定是 4 个空格的整倍数了
    还有一点就是如果注释某一行数据, 如果是第一行数据注释, 会比较麻烦
    使用这种换行, 会更整齐
    你 print 的括号里, 也可以这样
    print(
    '|生产日:' + makeData['D2_make_time'].strip(),
    '|生产日:' + makeData['D2_make_time'].strip(),
    '|生产日:' + makeData['D2_make_time'].strip(),
    )
    大概这样
    whoami9894
        5
    whoami9894  
       2018-08-28 16:25:35 +08:00 via Android
    好好看看文档 format 怎么用
    Yourshell
        6
    Yourshell  
       2018-08-28 16:27:58 +08:00 via iPhone
    format 解包 dict 就行了,或者直接实现__str__
    jswh
        7
    jswh  
       2018-08-28 16:47:14 +08:00
    tab 字符不就是干这事的嘛
    huangzhe8263
        8
    huangzhe8263  
       2018-08-28 17:03:51 +08:00
    pprint +1

    另外建议改为 dict constructor, 更直观, 并且 IDE 友好

    makeData = dict(
    D2_make_time='32',
    D4_make_seq='32',
    D16_make_zaijianum='32',
    D2_make_time='32',
    D9_make_carteam='韵达',
    D11_make_goodteam='A16'
    )

    另外你 dict 的 keyword 重复了
    lieh222
        9
    lieh222  
       2018-08-28 17:11:41 +08:00
    占位符啊
    output_template = '|生产日:%-5s|产 次:%-5s|在架数:%-5s|车 队:%-5s|货 队:%-5s'
    %-5s,长度小于 5 的自动向右补全空格
    iridescent0rsy
        10
    iridescent0rsy  
       2018-08-28 17:20:53 +08:00
    PrettyTable

    ```
    import prettytable as pt

    ## 按行添加数据
    tb = pt.PrettyTable()
    tb.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
    tb.add_row(["Adelaide",1295, 1158259, 600.5])
    tb.add_row(["Brisbane",5905, 1857594, 1146.4])
    tb.add_row(["Darwin", 112, 120900, 1714.7])
    tb.add_row(["Hobart", 1357, 205556,619.5])

    print(tb)
    ```
    ```
    +-----------+------+------------+-----------------+
    | City name | Area | Population | Annual Rainfall |
    +-----------+------+------------+-----------------+
    | Adelaide | 1295 | 1158259 | 600.5 |
    | Brisbane | 5905 | 1857594 | 1146.4 |
    | Darwin | 112 | 120900 | 1714.7 |
    | Hobart | 1357 | 205556 | 619.5 |
    +-----------+------+------------+-----------------+
    ```
    zhusimaji
        11
    zhusimaji  
       2018-08-28 17:50:01 +08:00 via iPhone
    @iridescent0rsy 感觉这个跟 pandas 差不多了,楼主可以考虑 pd.DateFrame.from_dict 然后打印
    reself
        12
    reself  
       2018-08-28 20:30:32 +08:00 via Android   ❤️ 1
    @lieh222 维护性奇差无比
    TripleZ
        13
    TripleZ  
       2018-08-28 20:42:35 +08:00
    用 `.format()` 或者是 `f""` 来格式化输出吧……
    用库的话`prettytable` 和 `pandas` 看起来都不错。
    hjq98765
        14
    hjq98765  
       2018-08-29 16:15:36 +08:00
    @jswh tab 还真不行,如果字符串之间的长度差超过了 1 个\t 的长度,就会彻底乱掉

    str.ljust 和 rjust 才是王道,谁用谁知道!
    jswh
        15
    jswh  
       2018-08-29 16:26:35 +08:00
    @hjq98765 受教了, 没考虑超出的情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2874 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:14 · PVG 19:14 · LAX 03:14 · JFK 06:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.