【问题标题】:Formatting with str.rjust and variables使用 str.rjust 和变量格式化
【发布时间】:2017-04-06 16:56:37
【问题描述】:

我是编码和这个网站的新手,所以请多多包涵。我正在研究“用 Python 自动化无聊的东西”,这是章节回顾问题之一。我不太关心解决.rjust 方法的奇怪行为的答案。这个项目的目标是右对齐几个字符串列表。为了测试我的过程,我编写了一个函数来处理一个列表。

我的目标:

   apples
  oranges
 cherries
  bananas

代码如下:

tableData = [['apples', 'oranges', 'cherries', 'bananas'],
                     ['Alice', 'Bob', 'Carol', 'David'],
                     ['dogs', 'cats', 'moose', 'goose']]

def test():
    for fruit in tableData[0]:
        longest = len(tableData[0][0])
        longestlen = len(fruit)
        if longest < len(fruit):
            longest = fruit
            longestlen = len(fruit)
        print(fruit.rjust(longestlen))

test()

我试图通过引用每个列表中最长的字符串来使 .rjust 动态化,但使用 "fruit.rjust(longestlen)" 会打印列表而没有证明它的合理性:

apples
oranges
cherries
bananas

如果我将"longestlen"int 交换,比如8,它可以正常工作。为什么我不能使用变量来定义理由,或者我做错了什么?我还没有找到任何关于此的文档。

编辑:

我意识到我在代码中添加了额外的变量。现在是这样写的:

def test():
    for fruit in tableData[0]:
        longest = len(tableData[0][0])
        if longest < len(fruit):
            longest = len(fruit)
        print(fruit.rjust(longest))

test()

这会打印相同的、不合理的输出,但更干净。 我意识到这与我的 .rjust() = 而不是 > len(fruit) 的值有相同的问题,这会导致 .rjust 方法出现问题。但是,如果我这样做:

print(fruit.rjust(longest + 1))

.rjust 现在应该可以正常工作了,因为它有更大的争论,对吗?然而它仍然不能证明向右。

【问题讨论】:

    标签: python string python-3.x variables justify


    【解决方案1】:

    rjust 与您试图证明的字符串长度具有相同的值,因此,您不会得到任何证明:

    print("foo".rjust(3))
    foo
    

    但是:

    print("foo".rjust(4))
     foo
    

    所以,为了让这个工作你首先需要获取最大长度,然后然后证明:

    def test():
        l = len(max(tableData[0], key=len))
        print(l)
        for fruit in tableData[0]:
            print(fruit.rjust(l))
    
    test()
    

    这里l = len(max(tableData[0], key=len))根据key(设置为它的len)获取tableData[0]中的最大值,然后获取该字符串的lencherries将得到返回所以len(cherries) == 8 将被使用)。

    现在可以正确打印出来:

      apples
     oranges
    cherries
     bananas
    

    如果您不能使用max,则必须遍历tableData[0] 一次以找到最大值,然后再次循环以打印出合理的值。

    首先,通过将初始计数器设置为0 并在找到更长的单词时递增它来找到最大值:

    longest = 0
    for fruit in tableData[0]:
        if longest < len(fruit):
            longest = len(fruit)
    

    循环结束后,longest 的值将是 8。现在,只需再次遍历列表并格式化,即:

    for fruit in tableData[0]:
        print(fruit.rjust(longest))
    

    将所有内容放在test 函数中,以您需要的方式打印出来:

    def test():
        longest = 0
        for fruit in tableData[0]:
            if longest < len(fruit):
                longest = len(fruit)
        for fruit in tableData[0]:
            print(fruit.rjust(longest))
    
    test()
    

    【讨论】:

    • 您的答案确实有效,但是在我的书中还有几章没有介绍 max() 方法,所以我正在尝试使用我已经知道的工具 - 即使我正在尝试这样做本质上是一样的。
    • 为你修复了@Apel。如果您认为我的回答回答了您的问题,您可以通过单击答案分数下方的勾号将其标记为已接受 :-)。
    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多