2010-11-29 17 views
28

Si yo quiero hacer mi cadena con formato dinámicamente ajustable, que cambiará el siguiente código deCadena de formato dinámicamente

print '%20s : %20s' % ("Python", "Very Good") 

a

width = 20 
print ('%' + str(width) + 's : %' + str(width) + 's') % ("Python", "Very Good") 

Sin embargo, parece que la concatenación de cadenas es engorroso aquí. ¿Alguna otra forma de simplificarlo?

Respuesta

21

Puede buscar el valor de relleno de la lista de argumentos:

print '%*s : %*s' % (20, "Python", 20, "Very Good") 

Puede incluso insertar los valores de relleno de forma dinámica:

width = 20 
args = ("Python", "Very Good") 
padded_args = zip([width] * len(args), args) 
# Flatten the padded argument list. 
print "%*s : %*s" % tuple([item for list in padded_args for item in list]) 
5
print '%*s : %*s' % (width, 'Python', width, 'Very Good') 
+0

+1 Esto es mejor respuesta que la mía. Estaba buscando funciones ljust y rjust para hacer eso. – pyfunc

1

Si no desea especificar el de ancho al mismo tiempo, puede preparar una cadena de formateo de antemano, como lo estaba haciendo, pero con otra sustitución. Usamos %% para escapar signos% reales en una cadena. Queremos terminar con %20s en nuestra cadena de formato cuando el ancho es 20, entonces usamos %%%ds y proporcionamos la variable de ancho para sustituirla allí. Los dos primeros signos% se convierten en un% literal, y luego% d se sustituye por la variable.

Por lo tanto:

format_template = '%%%ds : %%%ds' 
# later: 
width = 20 
formatter = format_template % (width, width) 
# even later: 
print formatter % ('Python', 'Very Good') 
+1

Me gusta esto como una forma de generar dinámicamente cadenas de formato en general. Sin embargo, el enfoque del Sr. Hamidi es mejor si solo el ancho del campo debe ser interpolado dinámicamente. –

28

Usted puede hacer esto utilizando el método str.format().

>>> width = 20 
>>> print("{:>{width}} : {:>{width}}".format("Python", "Very Good", width=width)) 
       Python :   Very Good 

A partir de Python 3.6 se puede utilizar para hacer esto f-string:

In [579]: lang = 'Python' 

In [580]: adj = 'Very Good' 

In [581]: width = 20 

In [582]: f'{lang:>{width}}: {adj:>{width}}' 
Out[582]: '    Python:   Very Good' 
+0

¡Gracias por agregar la solución f-strings! – Sebastiaan