Как правильно выровнять числовые данные?
У меня есть некоторые данные, которые я показываю в формате трех столбцов, формы:
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]))
Ответы
Ответ 1
В Python 2.5 используйте rjust (по строкам). Кроме того, попытайтесь привыкнуть к форматированию строк в python, а не просто конкатенировать строки. Простой пример для форматирования rjust и string ниже:
width = 10
str_number = str(ord('a'))
print 'a%s' % (str_number.rjust(width))
Ответ 2
В python 2.6+ (и это стандартный метод в 3), "предпочтительным" методом форматирования строк является использование string.format() (полные документы, для которых можно найти здесь).
правое оправдание может быть выполнено с помощью
"a string {0:>5}".format(foo)
это будет использовать 5 мест, однако
"a string {0:>{1}}".format(foo, width)
также действителен и будет использовать ширину значения, переданную в .format().
Ответ 3
Использовать форматирование строки python: '%widths'
где width - целое число
>>> '%10s' % 10
' 10'
>>> '%10s' % 100000
' 100000'
Ответ 4
В Python 3.6 вы можете использовать Литеральная строка
Интерполяция, которая меньше
verbose и, вероятно, более интуитивно понятным в использовании:
width = 5
number = 123
print (f'{number:>{width}}')
Или просто:
number = 123
print (f'{number:>5}')
Повторно использует большую часть синтаксиса str.format()
.
Я думаю/надеюсь, что это будет предпочтительный путь в будущем.
Ответ 5
Если вы знаете верхнюю границу ваших номеров, вы можете отформатировать ее с помощью "%<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