2012-03-04 51 views
0

我在Python下面的例子来打印一个表:使用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

我想:

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

    在上面的例子,这将是巨大的,有使用的最宽的条目在job_IDsmemory_used,和memory_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

+3

看看[我的回答(http://stackoverflow.com/a/9549302/4279)到以前的问题,即'宽度“变量。 – jfs 2012-03-04 02:32:46

回答

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