Питон: правильно обоснованный и упорядоченный дикт - PullRequest
0 голосов
/ 07 сентября 2018

Мой код:

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

Параметр заказа должен быть строкой, которая работает следующим образом: пусто (по умолчанию) означает, что таблица неупорядочена "count,desc" таблица упорядочена по количеству (предметов в инвентаре) в порядке убывания и "cound,asc" в порядке возрастания

Я написал функцию, которая находит самую длинную строку в каждом из внутренних списков, чтобы знать, насколько широким должен быть столбец, чтобы соответствовать всем строкам, но теперь я застрял в этой точке, что мне теперь делать?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Если это то, что вы пытаетесь сделать,

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")
0 голосов
/ 07 сентября 2018

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

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. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...