2009-09-19 15 views
20

estoy tratando de hacer esto:longitud variable de% s con el operador% en Python

max_title_width = max([len(text) for text in columns]) 

for column in columns: 
    print "%10s, blah" % column 

Pero quiero reemplazar el 10 con el valor de max_title_width. ¿Cómo hago esto de la manera más pitonica posible?

+4

En Python 2.4 y posterior, las [] son ​​innecesarias en su cálculo de max_title_width; solo crean una lista que descarta inmediatamente después de calcular el máximo. Ver http://www.python.org/dev/peps/pep-0289/. – PaulMcG

Respuesta

46

Este es un remanente de la marcación de formato C:

print "%*s, blah" % (max_title_width,column) 

Si desea que el texto justificado a la izquierda (para las entradas más cortas que max_title_width), poner un '-' antes del '*'.

>>> text = "abcdef" 
>>> print "<%*s>" % (len(text)+2,text) 
< abcdef> 
>>> print "<%-*s>" % (len(text)+2,text) 
<abcdef > 
>>> 

Si el campo len es más corta que la cadena de texto, la cadena a punto de desbordar:

>>> print "<%*s>" % (len(text)-2,text) 
<abcdef> 

Si desea recortar a una longitud máxima, utilice el '' campo de la precisión del formato de marcador de posición:

>>> print "<%.*s>" % (len(text)-2,text) 
<abcd> 

poner a todos juntos de esta manera:

% 
- if left justified 
* or integer - min width (if '*', insert variable length in data tuple) 
.* or .integer - max width (if '*', insert variable length in data tuple) 
+4

+1, no sabía que podría hacer eso –

+0

wow, gran truco! No sabía eso sobre el relleno izquierdo/derecho. –

22

Usted dispone de las nuevas cadenas de formato métodos de Python 3 y Python 2.6.

A partir de Python 2.6, la incorporada en clases str y Unicode proporcionan la capacidad de hacer sustituciones de variables complejas y el valor de formato a través del método str.format() se describe en el PEP 3101. La clase de formateador en el módulo de cadena le permite crear y personalizar sus propios comportamientos cadena de formato utilizando la misma aplicación como método de formateo de la().

(...)

For example, Suponga que desea tener un campo de reemplazo cuya anchura de campo es determinada por otra variable:

>>> "A man with two {0:{1}}.".format("noses", 10) 
"A man with two noses  ." 
>>> print("A man with two {0:{1}}.".format("noses", 10)) 
A man with two noses  . 

Así, por ejemplo su sería

max_title_width = max(len(text) for text in columns) 

for column in columns: 
    print "A man with two {0:{1}}".format(column, max_title_width) 

personalmente me encanta los nuevos métodos de formato, ya que son mucho más potente y fácil de leer en mi humilde opinión.

+0

No tenía idea de que pudieras hacer esto ... Al principio iba a decir que esto no era natural, pero después de pensarlo, ¡creo que tiene sentido! –

2

puede crear su plantilla fuera del bucle:

tmpl = '%%%ds, blah' % max_title_width 
for column in columns: 
    print tmpl % column 

También puede aprender sobre la new formatting en Python.

y por cierto, max no requiere de una lista, puede pasar que un iterable:

max_title_width = max(len(i) for i in columns) 
+0

max (columns, key = len) devuelve un elemento de 'columns'. El código del Póster original obtiene la * longitud * de la columna más larga ... – EOL

+0

bien capturado, ¿qué estaba pensando? – SilentGhost

+0

¿por qué el voto hacia abajo? – SilentGhost

3

Python 2.6+ ejemplos de versiones alternativas:

>>> '{:{n}s}, blah'.format('column', n=10) 
'column , blah' 
>>> '{:*>{l}s}'.format(password[-3:], l=len(password)) # password = 'stackoverflow' 
'**********low' 
>>> '{:,.{n}f} {}'.format(1234.567, 'USD', n=2) 
'1,234.57 USD' 

Aviso: primero no palabras clave args, luego la palabra clave args.

Cuestiones relacionadas