Использование спецификации формата Python Mini-Language для выравнивания поплавков
Я читал, что я могу использовать Python Mini Specification 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 Mini Specification Specification Mini-Language, чтобы сделать это так, как мне нужно?
Ответы
Ответ 1
Это то, что вы хотите:
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
Ответ 2
Здесь другая реализация, основанная на идее .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
Ответ 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('.')))
Он позволяет фиксированную точность после десятичной точки.
Ответ 4
Это делает:
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
Чтобы получить точный вывод, вам нужно сломать строки на необязательном "."
Вы также можете преобразовать эти строки в float.