【问题标题】:Python Exercise: Using repetition and concatenatePython 练习:使用重复和连接
【发布时间】:2020-06-13 03:56:43
【问题描述】:

我对 Python 和一般编程非常陌生,并且一直在思考一本名为“Think Python”的书中所谓的简单练习,并希望得到一些帮助以更好地理解和解决这个问题。如果这被认为太“简单”或离题,我提前道歉,但我不确定如何进一步研究这个具体示例。

编写一个名为 right_justify 的函数,它接受一个名为 s 的字符串作为参数,并打印带有足够前导空格的字符串,以便 字符串的最后一个字母在显示的第 70 列中。

right_justify('monty')

提示:使用字符串连接和重复。此外,Python 提供了一个 名为 len 的内置函数返回字符串的长度,因此 len('monty') 的值为 5。

我已经找到了这个具体练习的答案here,但在我找到这个解决方案之前,我尝试了一个自己的解决方案,并希望从不同的解决方案中学习,尽管它更加冗长。

起初,我认为这似乎很简单;我只需要使用提示的 len 函数获取参数的长度,然后将 70 除以该长度,然后简单地使用字符串重复和该除法结果进行打印。但是,我很快意识到这不适用于除法不是整数而是浮点数的长度的参数。于是我想出了一个主意:

    def right_justify(s):
        length = len(s)
        HP = int(70/length) 
#HP = Highest possible integer you can multiply with len(s) before exceeding total length of 70 , since int() will truncate a floating point result
        remainder = 70 - HP*length
        x = ' ', 'x', 'xx', 'xxx', 'x'*4, 'x'*5, 'x'*6, 'x'*7, 'x'*8, 'x'*9
        remainder = len(x)
        print(s*(HP-1)+x+s)

我在这里尝试做的是,首先我通过重复填充整行,同时为输入的最后一次迭代以及剩余长度(如果有)留出空间。为了确保最后一个字母是参数的最后一个字母,我首先将余数连接到 s*(HP-1),然后加入 s 的最后一次重复。

我已经看到我的代码存在问题,但我不知道如何解决它。首先是余数:如何编写程序,使 x 具有可变长度,并确保长度等于余数的 x 始终在最终的 print 语句中?

另外,当我尝试运行程序时,我收到一条错误消息:

Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    right_justify('test')
  File "<pyshell#24>", line 8, in right_justify
    print(s*(HP-1)+x+s)
TypeError: can only concatenate str (not "tuple") to str

我尝试用谷歌搜索 TypeError,但答案太具体或太高级,以至于我无法从他们那里获得任何理解。我希望有人可以帮助我理解解决这个问题所涉及的概念以及如何执行它们。谢谢!

编辑:感谢大家提供的所有信息丰富的答案!我很欣赏给出的所有不同的解决方案,有很多东西可以向他们学习。我决定选择 Pepi 的答案,因为他在我最初的思路中使用元组指导了解决这个问题的方法。

这是我使用我新发现的元组和索引知识来解决这个问题所写的:

def right_justify(s):
        length = len(s)
        HP = int(70/length) 
#HP = Highest possible integer you can multiply with len(s) before exceeding total length of 70 , since int() will truncate a floating point result
        remainder = 70 - HP*length
        x = '', 'x', 'xx', 'xxx', 'x'*4, 'x'*5, 'x'*6, 'x'*7, 'x'*8, 'x'*9
        y = x[remainder]
        print(s*(HP-1)+y+s)

感谢 Jack Taylor 和 Alain T. 提供的其他非常优雅的解决方案。

【问题讨论】:

  • 嗨!欢迎来到堆栈溢出!实际上有一个模运算符可以用来查找余数“%”,例如 8%3 将是 2,因为余数是 2。至于您的错误,请注意您的“x”变量定义为一个包含 10 个不同值的元组,“”是第一个,“x”*9 是最后一个。您不能将字符串 s 与 x 组合,因为 x 不是字符串(而是元组)。如果您打算获得 x 的特定值,则需要通过索引来访问它。如果我所说的令人困惑,请随时提出更多问题:)
  • @Arch2K 感谢模运算符提示,我不知道!我将阅读更多关于索引和元组以及如何将这两者连接在一起的内容。

标签: python


【解决方案1】:

首先 - 你的问题的答案:

线

x = ' ', 'x', 'xx', 'xxx', 'x'*4, 'x'*5, 'x'*6, 'x'*7, 'x'*8, 'x'*9

创建一个元组,其中是一种列表,在这种情况下包含字符串'','x','xx','xxx',...,'xxxxxxxxx'。

为了连接这些字符串之一,请使用索引获取您想要的字符串:x[i],其中 i 是从 0 到 9 的整数。(更一般地,列表类型的索引从 0 到 len (列表)-1.)

x[2]  #returns 'xx'

此引用的结果将是 str,并将连接到字符串的其余部分。

最后:我认为你会找到更短、更清晰的方法来解决给定的问题,但是玩一会儿也没有错。提示:此处避免使用浮点数学。

【讨论】:

  • 感谢您的提示!一个问题:元组中的 ' ' 是不是除了空格之外什么都没有,不被视为列表的一部分,因为根据您的解释,您从 'x' 开始在列表中计数为 0?
  • “ ”是元组的一部分。当我用那个元组运行x[2] 时,我得到“xx”。我认为写“xxx”是佩皮的错误。
  • 我修复了显示“xx”而不是“xxx”的答案。
  • 我还在元组的解释中添加了“”。
  • @user21600 大多数编程语言中的数组/元组索引从 0 开始,因此第一个元素的索引实际上是 0。这也是为什么“off by one”错误实际上非常普遍的原因
【解决方案2】:

如果你觉得懒惰,可以使用right-align format string

def right_justify(s):
    return "{:>70}".format(s)

【讨论】:

    【解决方案3】:

    使用连接、重复和 len 函数:

    " "*(70-len(s)) + s
    

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 2015-06-11
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2015-05-01
      • 1970-01-01
      相关资源
      最近更新 更多