我在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_IDs
,memory_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
答案 0 :(得分: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