Python: 右对齐和有序字典
Python: right justified and ordered dict
以下是我的代码:
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
订单参数必须是字符串,作用如下:
空(默认)表示 table 是无序的
"count,desc"
table 按数量(库存中的物品)降序排列,"cound,asc"
按升序排列
我写了一个函数,它在每个内部列表中查找最长的字符串,以了解列的宽度应该多宽才能容纳所有字符串,但现在我卡在了这一点上,我现在该怎么办?
你找到最长的密钥及其长度的想法是正确的。您只需要对其进行格式化即可:
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")
以下是我的代码:
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
订单参数必须是字符串,作用如下:
空(默认)表示 table 是无序的
"count,desc"
table 按数量(库存中的物品)降序排列,"cound,asc"
按升序排列
我写了一个函数,它在每个内部列表中查找最长的字符串,以了解列的宽度应该多宽才能容纳所有字符串,但现在我卡在了这一点上,我现在该怎么办?
你找到最长的密钥及其长度的想法是正确的。您只需要对其进行格式化即可:
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")