Как правильно выровнять числовые данные?

у меня есть некоторые данные, которые я отображаю в формате 3 столбцов, формы:

key: value key: <tab> key: value <tab> key: value.

вот пример:

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

тем не менее, я хотел бы, чтобы числа были выровнены правильно, например:

a:   1
b:  12
c: 123

как я могу это сделать в Python?

вот существующий код печати, который у меня есть:

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]))

5 ответов


в Python 2.5 используйте rjust (на строках). Кроме того, попробуйте привыкнуть к строка форматирования в python вместо того, чтобы просто объединять строки. Простой пример для rjust и форматирования строк ниже:

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

в python 2.6+ (и это стандартный метод в 3), "предпочтительным" методом форматирования строк является использование string.format () (полные документы, для которых можно найти здесь). правильное обоснование может быть сделано с помощью

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

это будет использовать 5 мест, однако

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

также допустимо и будет использовать ширину значения, как передано .формат.)(


использовать форматирование строк python:'%widths' где width-целое число

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

в Python 3.6 вы можете использовать Строковый Литерал Интерполяция, что меньше многословный и, вероятно, более интуитивно понятный в использовании:

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

или так:

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

он использует большую часть str.format() синтаксис.

Я думаю/надеюсь, что это будет предпочтительным образом в будущем.


Если вы знаете верхнюю границу aa для своих чисел, вы можете форматировать с помощью "%<lenght>d" % n. Учитывая, что все эти вычисления выполняются и в списке (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