¿Cómo alinear correctamente los datos numéricos?

Tengo algunos datos que estoy mostrando en formato de 3 columnas, de la forma:

key: value key: key: value key: value .

Aquí hay un ejemplo:

 p: 1 sl: 10 afy: 4 q: 12 lg: 10 kla: 3 r: 0 kl: 10 klw: 3 s: 67 vw: 9 jes: 3 t: 16 uw: 9 skw: 3 u: 47 ug: 9 mjl: 3 v: 37 mj: 8 lza: 3 w: 119 fv: 8 fxg: 3 x: 16 fl: 8 aew: 3 

Sin embargo, me gustaría si los números estuvieran bien alineados, como:

 a: 1 b: 12 c: 123 

¿Cómo puedo hacer esto en Python?

Aquí está el código de impresión existente que tengo:

 print(str(chr(i+ord('a'))) + ": " + str(singleArray[i]) + "\t" + str(doubleArray[i][0]) + ": " + str(doubleArray[i][1]) + "\t" + str(tripleArray[i][0]) + ": " + str(tripleArray[i][1])) 

Related of "¿Cómo alinear correctamente los datos numéricos?"

En Python 2.5 use rjust (en cadenas). Además, trata de acostumbrarte a formatear cadenas en python en lugar de solo concatenar cadenas. Ejemplo simple para formato de cadena y rjust a continuación:

 width = 10 str_number = str(ord('a')) print 'a%s' % (str_number.rjust(width)) 

En Python 2.6+ (y es el método estándar en 3), el método “preferido” para el formato de cadenas es usar string.format () (los documentos completos que se pueden encontrar aquí ). la justificación correcta se puede hacer con

 "a string {0:>5}".format(foo) 

esto usará 5 lugares, sin embargo

 "a string {0:>{1}}".format(foo, width) 

también es válido y utilizará el ancho del valor como se pasa a .format ().

Use el formato de cadena de python: '%widths' donde ancho es un entero

 >>> '%10s' % 10 ' 10' >>> '%10s' % 100000 ' 100000' 

En Python 3.6 puedes usar la Interpolación de Cadena Literal , que es menos detallada y probablemente más intuitiva de usar:

 width = 5 number = 123 print (f'{number:>{width}}') 

O solo:

 number = 123 print (f'{number:>5}') 

str.format() gran parte de la syntax str.format() .

Supongo / espero que esta sea la forma preferida en el futuro.

Si conoce un límite superior para sus números, puede formatear con "%d" % n . Teniendo en cuenta todos esos cálculos se realizan y en una lista de (char, num):

 mapping = ((chr(i+ord('a')), singleArray[i]), (doubleArray[i][0],doubleArray[i][1]), (tripleArray[i][0],tripleArray[i][1]) ) for row in mapping: print "%s: %3d" % row