Modo Pythonic per stampare una tabella
-
05-07-2019 - |
Domanda
Sto usando questa semplice funzione:
def print_players(players):
tot = 1
for p in players:
print '%2d: %15s \t (%d|%d) \t was: %s' % (tot, p['nick'], p['x'], p['y'], p['oldnick'])
tot += 1
e suppongo che i nick non siano più lunghi di 15 caratteri.
Vorrei mantenere ogni "colonna" allineato, c'è un po 'di zucchero sintattico che mi permette di fare lo stesso ma mantenendo la colonna dei nickname allineata a sinistra anziché allineata a destra, senza rompere la colonna a destra?
Il codice equivalente, più brutto, sarebbe:
def print_players(players):
tot = 1
for p in players:
print '%2d: %s \t (%d|%d) \t was: %s' % (tot, p['nick']+' '*(15-len(p['nick'])), p['x'], p['y'], p['oldnick'])
tot += 1
Grazie a tutti, ecco la versione finale:
def print_players(players):
for tot, p in enumerate(players, start=1):
print '%2d:'%tot, '%(nick)-12s (%(x)d|%(y)d) \t was %(oldnick)s'%p
Soluzione
Visto che p
sembra essere un dict, che ne dici di:
print '%2d' % tot + ': %(nick)-15s \t (%(x)d|%(y)d) \t was: %(oldnick)15s' % p
Altri suggerimenti
Per allineare a sinistra anziché allineare a destra, usa % -15s
anziché % 15s
.
Argomento leggermente fuori tema, ma puoi evitare di eseguire esplicite aggiunte su tot
usando enumerate
:
for tot, p in enumerate(players, start=1):
print '...'
O se usi python 2.6 puoi usare il format metodo della stringa:
Definisce un dizionario di valori e li utilizza per dipslay:
>>> values = {'total':93, 'name':'john', 'x':33, 'y':993, 'oldname':'rodger'}
>>> '{total:2}: {name:15} \t ({x}|{y}\t was: {oldname}'.format(**values)
'93: john \t (33|993\t was: rodger'