У вас есть правильная идея найти самый длинный ключ и его длину. Все, что вам нужно, это отформатировать его:
def print_table(inventory, order=None):
longest_key = max(inventory, key=len)
max_width = len(longest_key)
if order == "count,asc":
for key, value in sorted(inventory.iteritems(), key=lambda (k, v): (v, k)):
print '%6d %*s' % (value, max_width, key)
Выход:
1 dagger
1 rope
6 torch
42 gold coin
Обновление
Чтобы обратиться к различным столбцам сортировки и порядку (по возрастанию, по убыванию), я хотел бы предложить не передавать строку, а ключевую функцию и направление сортировки (по возрастанию или по убыванию):
def print_table(inventory, order=None, descending=False):
longest_key = max(inventory, key=len)
max_width = len(longest_key)
for key, value in sorted(inventory.iteritems(), key=order, reverse=descending):
print '%6d %*s' % (value, max_width, key)
# Define a bunch of key functions, used for sorting
by_count = lambda (k, v): (v, k)
by_name = None
inv = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1}
print '\nBy count, ascending'
print_table(inv, order=by_count)
print('\nBy name, descending')
print_table(inv, order=by_name, descending=True)
Примечание. По умолчанию функция sorted
будет сортировать dict.items()
по (k, v), поэтому функция by_name
может быть None
или более явной lambda (k, v): (k, v)
* 1017. *