使用 str.rjust 和变量进行格式化

Formatting with str.rjust and variables

我是编码和这个网站的新手,所以请多多包涵。我正在努力完成 "Automate the Boring Stuff with 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 应该可以正常工作,因为它有更大的争论,对吗?然而还是不靠右。

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]中的最大值,然后得到len 该字符串(cherries 将被返回,因此将使用 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()