我读到我可以使用Python的Format Specification Mini-Language来更好地控制字符串的显示方式。但是,我很难弄清楚如何使用它来显示小数点上对齐的浮点数。
例如,假设我有以下三个列表:
job_IDs = ['13453', '123', '563456'];
memory_used = [30, 150.54, 20.6];
memory_units = ['MB', 'GB', 'MB'];
我想迭代这三个列表并打印
Job 13453: 30 MB Job 123: 150.54 MB Job 563456: 20.6 GB
到目前为止,我已经尝试过:
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
打印:
Job 13453: 30 MB Job 123: 150.54 MB Job 563456: 20.6 GB
这几乎是正确的,但它没有对齐小数点周围的浮点数。我如何使用Python的Format Specification Mini-Language以我需要的方式进行操作?
答案 0 :(得分:11)
这就是你想要的:
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])
以下是它的工作原理:
这是主要部分: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
答案 1 :(得分: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))
Job 13453 : 30 MB
Job 123 : 150.54 GB
Job 563456: 20.6 MB
答案 2 :(得分:3)
如果它有帮助,这是我使用的类似功能:
def align_decimal(number, left_pad=7, precision=2):
"""Format a number in a way that will align decimal points."""
outer = '{0:>%i}.{1:<%i}' % (left_pad, precision)
inner = '{:.%if}' % (precision,)
return outer.format(*(inner.format(number).split('.')))
它允许小数点后的固定精度。
答案 3 :(得分:1)
这样做:
import re
job_IDs = ['13453', '123', '563456']
memory_used = ['30', '150.54', '20.6']
memory_units = ['MB', 'GB', 'MB']
for i in range(len(job_IDs)):
lh=re.match(r'(\d+)',memory_used[i]).group(1)
if '.' in memory_used[i]:
rh=re.match(r'(\d+)\.(\d+)',memory_used[i]).group(2)
sep='.'
else:
rh=''
sep=' '
my_str = "{item:15}{l:>6}{s:1}{r:6} {units:3}".format(
item='Job ' + job_IDs[i] + ':' , l=lh,s=sep,r=rh,units=memory_units[i])
print my_str
要获得精确的输出,您需要打破可选项的字符串。&#39;
您还可以将这些字符串转换为浮点数。