0

以下是我的代码:

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"升序排序

我编写了在每个内部列表中查找最长字符串的函数,以了解列的宽度以适合所有字符串,但现在我被困在这一点上,我现在该怎么办?

4

2 回答 2

1

您有正确的想法来找到最长的密钥及其长度。您只需要格式化它:

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函数会按照 (k, v) 对 a 进行排序dict.items(),所以by_name函数可以是None,也可以是更显式的lambda (k, v): (k, v)

于 2018-09-07T13:47:05.047 回答
0

如果这是你想要做的,

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")
于 2018-09-07T14:11:19.070 回答