【问题标题】:Using Python's Format Specification Mini-Language to specify or automatically determine column widths使用 Python 的 Format Specification Mini-Language 指定或自动确定列宽
【发布时间】:2012-03-04 01:57:13
【问题描述】:

我在 Python 中有以下示例来打印表格:

job_IDs = ['13453', '123', '563456'];
memory_used = [30, 150.54, 20.6];
memory_units = ['MB', 'GB', 'MB'];

for i in range(len(job_IDs)):
    print "Job {item:15} {value[0]:>6}.{value[1]:<6} {units:3}".format(
    item=job_IDs[i]+':', value=memory_used[i].split('.') if '.' in memory_used[i] 
    else  (memory_used[i], '0'), units=memory_units[i])

导致:

Job 13453:                 30          MB
Job 123:                  150.54       MB
Job 563456:                20.6        GB

垂直对齐对于我的需要是正确的,但是水平填充是在代码中手动硬编码的,它说:

"Job {item:15} {value[0]:>6}.{value[1]:<6} {units:3}"

(上面的“填充参数”是15, 6, 6, 3

我想:

  • 理想情况下,自动确定填充值(即根据每个字段的最大宽度计算),而不必在上面的语句中对其进行硬编码。

    在上面的示例中,最好有一个 sn-p,它使用 job_IDsmemory_usedmemory_units 和输出中最宽条目的宽度,并在列之间留一个空格:

    Job 13453:   30    MB
    Job 123:    150.54 MB
    Job 563456:  20.6  GB
    
  • 另外,我也对允许我在变量中指定此类填充的解决方案感兴趣(以防我想控制赋予每列的宽度)。

我对这两个问题的解决方案感兴趣:自动计算填充,以及使用变量指定填充。

顺便说一句,这个问题的灵感来自另一个问题: Using Python's Format Specification Mini-Language to align floats

【问题讨论】:

  • my answer到你之前的问题,即width变量。

标签: python formatting string.format


【解决方案1】:

您可以嵌套参数以更改整数宽度,如下所示:

job_IDs = ['13453', '123', '563456'];
memory_used = ['30', '150.54', '20.6'];
memory_units = ['MB', 'GB', 'MB'];

w1=15
w2=6
w3=6
w4=3
for i in range(len(job_IDs)):
    v=memory_used[i].split('.') if '.' in memory_used[i] else  (memory_used[i], '0')

    print "Job {item:{w1}} {value[0]:>{w2}}.{value[1]:<{w3}} {units:{w4}}".format(
       item=job_IDs[i]+':', w1=w1, w2=w2,w3=w3,w4=w4, value=v, units=memory_units[i])

因此,要确定要使用的字段宽度,只需在打印前循环一次以确定每个适用的嵌入宽度变量要使用的最宽宽度。

像这样:

job_IDs = ['13453', '123', '563456'];
memory_used = ['30', '150.54', '20.6'];
memory_units = ['MB', 'GB', 'MB'];

w1=1
w2=1
w3=1
w4=1
for i in range(len(job_IDs)):
    v=memory_used[i].split('.') if '.' in memory_used[i] else  (memory_used[i], '0')
    item=job_IDs[i]+':'
    units=memory_units[i]
    if len(item)>w1: w1=len(item)
    if len(v[0])>w2: w2=len(v[0])
    if len(v[1])>w3: w3=len(v[1])
    if len(units)>w4: w3=len(units)

for i in range(len(job_IDs)):
    v=memory_used[i].split('.') if '.' in memory_used[i] else  (memory_used[i], '0')
    item=job_IDs[i]+':'
    units=memory_units[i]    
    print "Job {item:{w1}} {value[0]:>{w2}}.{value[1]:<{w3}} {units:{w4}}".format(
      item=item,w1=w1, w2=w2,w3=w3,w4=w4, value=v, units=units)

输出:

Job 13453:   30.0  MB
Job 123:    150.54 GB
Job 563456:  20.6  MB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多