Pregunta

Estoy usando esta función simple:

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

y supongo que los nicks no tienen más de 15 caracteres.
Me gustaría mantener cada " columna " alineado, ¿hay algo de azúcar sintáctica que me permita hacer lo mismo pero manteniendo la columna de apodos alineada a la izquierda en lugar de alineada a la derecha, sin romper la columna de la derecha?

El código equivalente, más feo, sería:

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

Gracias a todos, aquí está la versión final:

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
¿Fue útil?

Solución

Al ver que p parece ser un dictador, ¿qué tal?

print '%2d' % tot + ': %(nick)-15s \t (%(x)d|%(y)d) \t was: %(oldnick)15s' % p

Otros consejos

Para alinear a la izquierda en lugar de alinear a la derecha, use % -15s en lugar de % 15s .

Un poco fuera del tema, pero puede evitar realizar una adición explícita en tot utilizando enumerate :

for tot, p in enumerate(players, start=1):
    print '...'

O si usa Python 2.6, puede usar el formato método de la cadena:

Esto define un diccionario de valores, y los usa para la reproducción:

>>> 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'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top