2016-11-19 10 views
0

У меня есть словарь, который выглядит примерно так:последовательного форматирования строк из словаря с этикетками в питон оператора печати

d = { 
    'last_price': '760.54', 
    'change': 'N/A', 
    'days_range': '760.00 - 775.00', 
    'previous_close': '771.23', 
    'change_percent': '-1.39%', 
} 

Все значений в этом словаре может быть изменено. Числа могут сильно различаться от отдельных цифр до цифр длиной в несколько цифр. Я хотел бы форматировать эту информацию и последовательно представить это следующим образом:

Last:   $760.54   Change:   N/A (-1.39%) 
Prev Close:  $771.23   Day's Range: $760.00 - $775.00 

До сих пор я пытался сделать это, делая это:

print "\ 
Last: {last_price:>17} \t Change: {change:>11} ({change_percent}) \n\ 
Prev Close: {previous_close:>11} \t Day's Range: {days_range:>18}\ 
".format(**d) 

Это производит вывод, который выглядит следующим образом :

Last:   760.54   Change:   N/A (-1.39%) 
Prev Close:  771.23   Day's Range: 760.00 - 775.00 

Хотя это работает достаточно хорошо, если число не изменится, если «days_range» установлен в значение типа «78.91 - 79.91» он будет прыгать дальше вправо. Например:

Last:    79.21   Change:   N/A (-1.19%) 
Prev Close:  80.16   Day's Range:  78.91 - 79.91 

Я также не могу сказать, что я очень доволен, используя «\ т», чтобы отделить столбцы, как я обеспокоен тем, что если значения в первом столбце слишком долго, это может привести к правую колонку, чтобы ее толкнуть дальше, чем хотелось.

Есть ли простой и элегантный способ сделать это? Я бы предпочел решение, которое не зависит от нестандартных библиотек и относительно просто.

Я также хотел бы знать простой способ добавления значений знаками доллара без необходимости изменять значения в словаре.

+0

Он прыгает вправо, потому что это более короткая строка, и вы правы, выравнивая их. Похоже, вы хотите, чтобы каждое значение выравнивалось по левому краю внутри столбца. – TigerhawkT3

ответ

0

Вы можете изменить его, чтобы выровнять влево, и она работала для меня (я использовал ljust(), но так, как вы это делаете с форматом должен также работать):

def print_data(d,spaces): 
    print('Last:'.ljust(spaces) + d['last_price'].ljust(spaces) + \ 
      'Change:'.ljust(spaces) + d['change'] + ' (' + d['change_percent'] + ')') 
    print('Prev close:'.ljust(spaces) + d['previous_close'].ljust(spaces) + 
      "Day's Range:".ljust(spaces) + d['days_range']) 

data = { 
    'last_price': '760.54', 
    'change': 'N/A', 
    'days_range': '760.00 - 775.00', 
    'previous_close': '771.23', 
    'change_percent': '-1.39%', 
} 
print_data(data,15) 

print() 

data['days_range'] = '78.91 - 79.91' 
print_data(data,15) 

Что касается второго вопроса о добавив знаки доллара, все, кроме «Дневного диапазона», должно быть легко. Для «Дневного диапазона» я не могу придумать более простой способ, чем добавить его на передний план и разбить строку на ' - ' и добавить ее ко второй половине.

+0

Спасибо. Это отличное решение. Ценю вашу помощь. – ag415

+0

Нет проблем! Удачи с запасами! – abacles

1

В Python 3 и более новой версии, вы можете сделать это с помощью str.format() как:

print('{:<15} {:<15} {:<15} {:<15}'.format('Last:', d['last_price'], 'Change:', '{} ({})'.format(d['change'], d['change_percent']))) 
#  ^Note this 

который печатает:

Last:   760.54   Change:   N/A (-1.39%) 

Здесь < означает, что вы хотите, чтобы содержание быть выравнивание по левому краю из указанной вами позиции курсора, где > означает выравнивание по правому краю.

Вот результат данных, которые вы печатаете при печати одновременно:

>>> '{:<15} {:<15} {:<15} {:<15}'.format('Prev Close:', 771.23, 'Day\'s Range:', '760.00 - 775.00') 
"Prev Close:  771.23   Day's Range: 760.00 - 775.00" 
>>> '{:<15} {:<15} {:<15} {:<15}'.format('Prev Close:', 80.16, 'Day\'s Range:', '78.91 - 79.91') 
"Prev Close:  80.16   Day's Range: 78.91 - 79.91 " 

Все coulmns имеют выравнивание по левому краю.


Примечание: Над sysntax для строки форматирования доступна только с Python 3 и новее.В более старых версиях вы должны сделать это с %s как:

'%-15s %-15s %-15s %-15s' % ('Change: ', d['last_price'], 'Change:', '{} ({})'.format(d['change'], d['change_percent'])) 
#  ^'-'ive value means align left 

который печатает:

'Change:   760.54   Change:   N/A (-1.39%) ' 

 Смежные вопросы

  • Нет связанных вопросов^_^