【问题标题】:How make a diamond text pattern in python 3.5 using loops如何使用循环在 python 3.5 中制作菱形文本模式
【发布时间】:2016-06-23 20:38:49
【问题描述】:

如标题中所述,我希望使用 python 3.5 制作菱形文本图案,但我对如何使形状正常工作有点困惑。

期望的输出:

                   S
                  SAS
                 SAMAS
                SAMPMAS
               SAMPLPMAS
              SAMPLELPMAS
               SAMPLPMAS
                SAMPMAS
                 SAMAS
                  SAS
                   S

代码:

word=input("Enter characters: ")
length=len(word)
for i in range (0, length):
    for j in range(length-i-1):
        print(' ', end="")
    for j in range(0, i+1):
        print(word[j], end="")
    for k in range (i-1, -1, -1):
        print (word[k], end="")
    print()
for l in range (1,length):
    for j in range(l) :
        print(' ', end="")
    for m in range (0,length-l-1):
        print(word[m], end ="")
    for n in range (length-l-1,-1,-1):
        print(word[n], end="")

当前输出:

      f
     fof
    fooof
   fooboof
  foobaboof
 foobaraboof
  foobaboof  fooboof   fooof    fof     f

【问题讨论】:

  • 请不要将解决方案编辑到您的问题中。如果您认为其他人看到您对 Chris Mueller 解决方案的变体有用,请随时使用页面底部的框将其添加为附加答案。
  • 感谢您的提醒,我会记住这一点的。

标签: python python-3.x ascii-art


【解决方案1】:

怎么样

import itertools
l = len(word)
for j in itertools.chain(range(l), reversed(range(l-1))):
    print(word[0:j].rjust(l) + word[j::-1])

它给出了你正在寻找的输出。这使用rjust 字符串方法在缩短的单词之前正确填充空格,并使用扩展切片来获取字符串的反转部分。

【讨论】:

    【解决方案2】:

    看起来您在每行的开头缺少等于 length - i - 1length - l - 1 空格的填充。

    def print_row(i, l):
        print(" " * (l - i - 1), end="")
        for j in range(0, i+1):
            print(word[j], end="")
        for k in range(i-1, -1, -1):
            print(word[k], end="")
        print()
    
    for i in range(0, length):
        print_row(i, length)
    for l in range(length, -1, -1):
        print_row(l, length)
    

    编辑:简化循环

    【讨论】:

    • 不需要额外的循环来打印重复的空格字符串。 :D
    • 程序还是不正确,菱形的下半部分没有打印正确的字符。
    • 哈哈,因为我复制粘贴了 OP 的代码。我刚刚注意到您在第二个 for 循环中选择的字母已关闭,并且您的循环缩短了 1 次迭代。
    • 我已经修复了错误并更新了我的答案,现在一切正常。
    • 为简单起见,我们看到可以提取行打印,因为功能相同,只是顺序不同;因此进行了编辑。
    【解决方案3】:

    你几乎已经自己解决了,唯一缺少的是每行前面的空格。现在第一行前面有n-1个空格,n是字符串的长度,第二行有n-2个空格前面等等,直到我们到达中间。中间行前面不能有空格。

    到达中间后,我们再次一次增加一个标题空格的数量。

    word=input("请输入字符:") 长度=长度(字) 对于范围内的 i (0, 长度): 对于范围内的 j(长度-i-1): print(' ', end="") 对于范围内的 j (0, i+1): 打印(字[j],结束=“”) 对于范围内的 k (i-1, -1, -1): 打印 (word[k], end="") 打印() 对于 l 在范围内(长度,0,-1): 对于范围内的 j(长度-l+1): print(' ', end="") 对于范围内的 m (l-1, 0, -1): 打印(字[米],结束=“”) 对于范围 (0, i-1) 中的 n: 打印(字[n],结束=“”) 打印()

    不幸的是,这不是您代码中的唯一问题。当你测试它时,你会得到一个像这样的钻石:

         f
        fof
       fooof
      fooboof
     foobaboof
    foobaraboof
     raboofoob
      aboofoob
       boofoob
        oofoob
         ofoob
          foob
    
    word=input("请输入字符:") 长度=长度(字) 对于范围内的 i (0, 长度): 对于范围内的 j(长度-i-1): 打印('',结束=“”) 对于范围内的 j (0, i+1): 打印(字[j],结束=“”) 对于范围内的 k (i-1, -1, -1): 打印 (word[k], end="") 打印() 对于范围内的 l (1,length): 对于范围内的 j (l): 打印('',结束=“”) 对于范围内的 m (0,length-l-1): 打印(字[米],结束=“”) 对于范围内的 n (length-l-1,-1,-1): 打印(字[n],结束=“”) 打印()

    打印出来:

         f
        fof
       fooof
      fooboof
     foobaboof
    foobaraboof
     foobaboof
      fooboof
       fooof
        fof
         f
    

    【讨论】:

    • @BenS:我已经在本地使用foobar 作为字符串对其进行了测试。你能用你获得的输出更新你的问题吗?
    • @BenS:发现错误,我没有完全复制粘贴片段;最后一行丢失了。现在应该修复了。
    【解决方案4】:

    您必须打印出空格。把它想象成一个矩形而不是菱形。

    让您开始:

    for i in range (0, length):
      for x in range(0, length-i):
        print(" ", end="")
      for j in range(0, i+1):
        print(word[j], end="")
      ...
    

    【讨论】:

      【解决方案5】:

      这段代码可以解决这个问题,而且非常简单:

      def diamond():
          word = input("Enter characters : ")
          space_length = len(word)
          for i in range(len(word)):
              space_length -= 1
              for k in range(space_length, 0, -1):
                  print(" ", end="")
              sliced = word[0:i+1]
              for j in sliced:
                  print(j, end="")
              for j in range(0, i):
                  print(sliced[len(sliced)-j-2], end="")
              print()
          space_length = 0
          for i in range(len(word), 0, -1):
              space_length += 1
              for k in range(space_length):
                  print(" ", end="")
              sliced = word[0:i-1]
              for j in sliced:
                  print(j, end="")
              for j in range(len(sliced) - 2, -1, -1):
                  print(sliced[j], end="")
              print()
      

      示例输出:输入字符:foobar

            f
           fof
          fooof
         fooboof
        foobaboof
       foobaraboof
        foobaboof
         fooboof
          fooof
           fof
            f
      

      【讨论】:

        【解决方案6】:

        您可以使用列表理解和居中的字符串填充,循环生成的列表并对字符串进行切片以创建菱形,如下所示:

        # concatenated list comprehensions
        # form 0 to 11 to 0 in steps of 2
        diamondlist = [i for i in range(1,12,2)] + [i for i in range(9,0,-2)]
        
        # string to print in diamond shape
        text = 'SAMPLETEXTS'
        
        # loop through list using fomat to centre string
        # as i incr/decr string is sliced
        # y is length of text
        for i in diamondlist:
            y = len(text)
            print('{:^{}s}'.format(text[:i], y))
        

        输出:

             S     
            SAM    
           SAMPL   
          SAMPLET  
         SAMPLETEX 
        SAMPLETEXTS
         SAMPLETEX 
          SAMPLET  
           SAMPL   
            SAM    
             S 
        

        注意:

        这仅适用于从 1 开始的菱形,但无需太多工作,您可以将其转换为以字符串 a 和菱形宽度作为参数的函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多