2009-09-19 13 views
20

Sto cercando di fare questo:lunghezza variabile di% s con l'operatore% in python

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

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

Ma voglio sostituire il 10 con il valore di max_title_width. Come faccio a farlo nel modo più pitonioso possibile?

+4

In Python 2.4 e versioni successive, le [] non sono necessarie per il calcolo di max_title_width - si limitano a compilare un elenco che si elimina immediatamente dopo aver calcolato il valore massimo. Vedi http://www.python.org/dev/peps/pep-0289/. – PaulMcG

risposta

46

Questo è un riporto dal markup formattazione C:

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

Se si desidera che il testo allineato a sinistra (per le voci più brevi di max_title_width), mettere un '-' prima del '*'.

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

Se il campo len è più corta della stringa di testo, la stringa trabocca solo:

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

Se si vuole ritagliare ad una lunghezza massima, utilizzare il '' campo di precisione del formato segnaposto:

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

metterli tutti insieme in questo modo:

% 
- 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, non sapevo che potessi fare quello –

+0

wow, bel trucco! Non lo sapevo riguardo il padding sinistro/destro. –

22

Hai le nuove stringhe di formattazione metodi da Python 3 e Python 2.6.

partire dal Python 2.6, il classi incorporate str e unicode forniscono la capacità di fare sostituzioni variabile complessa e valore formattazione tramite il metodo str.format() descritto nella PEP 3101. La classe Formatter nel modulo stringa consente di creare e personalizzare i propri comportamenti di formattazione delle stringhe utilizzando la stessa implementazione del metodo built-in format().

(...)

For example, si supponga di voler avere un campo sostitutivo la cui larghezza di campo è determinata da un'altra variabile:

>>> "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  . 

Così, per il tuo esempio sarebbe

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 adoro i nuovi metodi di formattazione, in quanto sono molto più potenti e leggibili a mio modesto parere.

+0

Non avevo idea che tu potessi fare questo ... All'inizio stavo per dire che questo mi sembrava innaturale, ma dopo averci pensato, immagino che abbia senso! –

2

si potrebbe creare il modello al di fuori del ciclo:

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

Si potrebbe anche conoscere la new formatting in pitone.

e btw, max non richiede un elenco, si può passare un iterabile:

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

max (colonne, chiave = len) restituisce un elemento da 'columns'. Il codice del Poster originale ottiene la * lunghezza * della colonna più lunga ... – EOL

+0

ben catturato, cosa stavo pensando. – SilentGhost

+0

perché il voto negativo? – SilentGhost

3

Python 2.6+ alternano esempi Versione:

>>> '{:{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' 

Suggerimento: prima args non di parole chiave, quindi args parole chiave.

Problemi correlati