使用Python的格式规范迷你语言来对齐浮点数

Ame*_*ina 17 python string

我读到我可以使用Python的格式规范迷你语言来更好地控制字符串的显示方式.但是,我很难弄清楚如何使用它来显示小数点上对齐的浮点数.

例如,假设我有以下三个列表:

job_IDs = ['13453', '123', '563456'];
memory_used = [30, 150.54, 20.6];
memory_units = ['MB', 'GB', 'MB'];
Run Code Online (Sandbox Code Playgroud)

我想迭代这三个列表并打印

Job 13453:   30      MB
Job 123:    150.54   MB
Job 563456:  20.6    GB
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试过:

for i in range(len(jobIDs)):
   my_str = "{item:15}{value:6} {units:3}".format( 
   item='Job ' + job_IDs[i] + ':' , value=str(memories[i]),units=memory_units[i]);

   print my_str
Run Code Online (Sandbox Code Playgroud)

打印:

Job 13453:   30      MB
Job 123:     150.54  MB
Job 563456:  20.6    GB
Run Code Online (Sandbox Code Playgroud)

这几乎是正确的,但它没有对齐小数点周围的浮点数.如何使用Python的格式规范迷你语言以我需要的方式完成它?

qua*_*tum 12

这就是你想要的:

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])
Run Code Online (Sandbox Code Playgroud)

下面是它的工作原理:

这是主要部分:value=memory_used[i].split('.') if '.' in memory_used[i] else (memory_used[i], '0'),表示:如果有小数点,则将字符串拆分为整数和小数部分,或将小数部分设置为0.

然后在格式字符串中:{value[0]:>6}.{value[1]:<6}表示整个部分向右移动,然后是一个点,然后小数部分向左移动.

打印:

Job 13453:              30.0      MB
Job 123:               150.54     GB
Job 563456:             20.6      MB
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 10

这是基于.split('.')想法的另一种实现.它可能更具可读性.拆分'.',右对齐左侧部分,左侧对齐右侧部分:

width = max(map(len, job_IDs)) # width of "job id" field 
for jid, mem, unit in zip(job_IDs, memory_used, memory_units):
  print("Job {jid:{width}}: {part[0]:>3}{part[1]:1}{part[2]:<3} {unit:3}".format(
    jid=jid, width=width, part=str(mem).partition('.'), unit=unit))
Run Code Online (Sandbox Code Playgroud)

产量

Job 13453 :  30     MB 
Job 123   : 150.54  GB 
Job 563456:  20.6   MB 
Run Code Online (Sandbox Code Playgroud)