una - python metodo find
Usando el Mini-lenguaje de especificación de formato de Python para alinear flotadores (4)
Leí que puedo usar el Mini-lenguaje de especificación de formato de Python para tener más control sobre cómo se muestran las cadenas. Sin embargo, me resulta difícil descubrir cómo usarlo para mostrar flotantes alineados con el punto decimal.
Por ejemplo, digamos que tengo tres listas siguientes:
job_IDs = [''13453'', ''123'', ''563456''];
memory_used = [30, 150.54, 20.6];
memory_units = [''MB'', ''GB'', ''MB''];
Me gustaría recorrer estas tres listas e imprimirlas.
Job 13453: 30 MB Job 123: 150.54 MB Job 563456: 20.6 GB
Hasta ahora he intentado:
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
que imprime:
Job 13453: 30 MB Job 123: 150.54 MB Job 563456: 20.6 GB
que es casi correcto, pero no alinea los flotadores alrededor del punto decimal. ¿Cómo puedo usar el Mini-lenguaje de especificación de formato de Python para hacerlo de la forma que necesito?
Aquí hay otra implementación basada en la .split(''.'')
. Podría ser más legible. Dividir en ''.''
, alinea a la derecha la parte izquierda, alinea a la izquierda la parte derecha:
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))
Output
Job 13453 : 30 MB
Job 123 : 150.54 GB
Job 563456: 20.6 MB
En caso de que ayude, aquí hay una función similar que uso:
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(''.'')))
Permite una precisión fija después del punto decimal.
Esto es lo que quieres:
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])
Así es como funciona:
Esta es la parte principal: value=memory_used[i].split(''.'') if ''.'' in memory_used[i] else (memory_used[i], ''0'')
value=memory_used[i].split(''.'') if ''.'' in memory_used[i] else (memory_used[i], ''0'')
, lo que significa: si hay un punto decimal, divida la cadena como la parte entera y la parte decimal, o establezca la parte decimal en 0.
Luego, en la cadena de formato: {value[0]:>6}.{value[1]:<6}
significa que toda la parte se desplazó hacia la derecha, seguida de un punto, luego la parte decimal se desplazó hacia la izquierda.
que imprime:
Job 13453: 30.0 MB
Job 123: 150.54 GB
Job 563456: 20.6 MB
Esto lo hace:
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
Para obtener su salida precisa, necesita romper las cadenas en el opcional ''.''
También puedes convertir esas cadenas a flotadores.