Питон: правильно обоснованный и упорядоченный дикт
Ниже приведен мой код:
inv = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1}
x=max(inv, key=lambda x: len(x.split()))
y=len(x)
#print(y)
n = "-"
q = n * (y+5)
#print(q)
#print("")
def print_table(inventory, order=None):
if order=="count,asc":
for key, value in sorted(inventory.iteritems(), key=lambda (k, v): (v, k)):
print "%s %s" % (value, key)
print_table(inv,"count,asc")
Я хочу иметь что-то вроде этого:
Inventory:
count item name
----------------
45 gold coin
12 arrow
6 torch
2 dagger
1 rope
1 ruby
----------------
Total number of items: 67
Параметр order должен быть строкой, которая работает следующим образом: пусто (по умолчанию) означает, что таблица неупорядочена"count,desc"
таблица упорядочена по количеству (предметов в инвентаре) в порядке убывания и "cound,asc"
в порядке возрастания
Я написал функцию, которая находит самую длинную строку в каждом из внутренних списков, чтобы знать, насколько широким должен быть столбец, чтобы соответствовать всем строкам, но теперь я застрял в этой точке, что мне теперь делать?
2 ответа
У вас есть правильная идея найти самый длинный ключ и его длину. Все, что вам нужно, это отформатировать его:
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)
Если это то, что вы пытаетесь сделать,
reverse=True
в твоем разобранном методе подойдёт!
def print_table(inventory, order=None):
if order=="count,asc":
for key, value in sorted(inventory.iteritems(), key=lambda (k, v): (v, k)):
print str(value).rjust(10), key.rjust(10)
elif order=="count,desc":
for key, value in sorted(inventory.iteritems(), key=lambda (k, v): (v, k), reverse=True):
print str(value).rjust(10), key.rjust(10)
print_table(inv,"count,desc")