当前位置: 首页 > 知识库问答 >
问题:

Python:右对齐和有序dict

公羊光明
2023-03-14

以下是我的代码

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个答案

卢骏俊
2023-03-14

如果这就是你想要做的,

反向=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")
景景胜
2023-03-14

你有正确的想法来找到最长的键及其长度。所有你需要的是格式化它:

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)对dict.items()进行排序,因此By_name函数可以是None,也可以是更明确的lambda(k,v):(k,v)

 类似资料:
  • 是否可以创建一个带有右对齐图标和文本的,图标在右边,像这样: 我见过这个问题,但这真的是最好的方法吗?

  • 问题内容: 我可以将JTextArea中的文本向右对齐(或通常更改文本对齐方式)吗? 我一直在搜索数小时,似乎其他人之前也曾问过这个问题,但没有好的答案(这确实有效)。 提前致谢! 问题答案: 尝试使用或代替。 有关更多信息,请查看此线程在JEditorPane中的文本垂直对齐 样例代码: 编辑 你可以试试

  • 问题内容: 基本上,我有一个JTable包含具有右对齐单元格但左对齐标题的列,这看起来确实很糟糕。我想在不更改标题的“外观”的情况下,将这些列的标题右对齐。 谢谢 问题答案: 这是修改表格的的另一种方法。对于此用法,这不是严格必要的,但可以最大程度地减少对UI委托外观的影响。 典型用法: 自定义标题渲染器:

  • 我有一个EditText包含在TextInputLayout中。我希望在EditText下显示错误,但要对齐到屏幕的右端。 我的XML是: 我在使用数据绑定。

  • 在Java中,如何使用printf()对同一行的输出进行一致的左对齐和右对齐?这是所有left aligned的代码: 这是所有东西都保持对齐的输出: 相反,如果第三个元素(0.20,1.00,9.00)是正确的,那么我想要的是什么。我在上面的输出中指出“l”是左对齐的,但我希望变量在“r”所在的位置是右对齐的。如何使右边的输出(0.20,1.00,9.00)右对齐,同时使左边的输出(苹果,派,奶

  • 问题内容: 我想有A B和C中间对齐。 我如何才能D完全右移? 问题答案: 以下是实现此布局的五个选项: CSS定位 带有不可见DOM元素的Flexbox 带有不可见伪元素的Flexbox Flexbox与 flex: 1 CSS网格布局 方法1:CSS定位属性 应用于容器。 应用于项目D。 现在,此项目已完全放置在flex容器中。 更具体地说,项目D从文档流中删除,但停留在最接近的祖先的范围内。

  • 问题内容: 我有这些数字的数组 我使用这样的对象 得到这些结果 但是我需要像下面这样将结果对齐到正确的位置 您的帮助已经受到赞赏。 问题答案: 您可以将其包装成这样的呼叫: