在字典中水平打印列表

时间:2017-10-16 20:28:23

标签: python python-3.x

这是我目前的代码:

    def print_banner(input_text, horiz_vert, letters):
    '''prints string into ascii art.'''
    #Prints Horizontal 
    if horiz_vert == "horizontal":
        for i in input_text:
            for j in range(6):
                print(letters[i][j], end = "")
            print()


    #Prints Vertical 
    elif horiz_vert == "vertical":
        for i in input_text:
            for j in range(6):
                print(letters[i][j])
            print()


def main():
    # Input text to be changed into ascii art.
    input_text = input("Input your string of text here: ").lower()
    # Chooses horizontal or vertical.
    horiz_vert = input("Would you like horizontal or vertical? ").lower()
    # Dictonary with all the accii art letters
    letters = {"a": ["     ___ ",
                     "    /   \ ",
                     "   /  ^  \ ",
                     "  /  /_\  \ ",
                     " /  _____  \ ",
                     "/__/     \__\ "],
               "b": [".______ ",
                     "|   _  \ ",
                     "|  |_)  | ",
                     "|   _  < ",
                     "|  |_)  |",
                     "|______/ "]}

    print_banner(input_text, horiz_vert, letters)


# Calls Main
if __name__ == "__main__":
    main()

目前如果您输入&#34; ab&#34;对于input_text并执行垂直打印选项,您将获得以下输出:

     ___ 
    /   \ 
   /  ^  \ 
  /  /_\  \ 
 /  _____  \ 
/__/     \__\ 

.______ 
|   _  \ 
|  |_)  | 
|   _  < 
|  |_)  |
|______/ 

但是当你输入水平时我想获得以下输出:

     ___         .______ 
    /   \        |   _  \ 
   /  ^  \       |  |_)  |    
  /  /_\  \      |   _  < 
 /  _____  \     |  |_)  |
/__/     \__\    |______/ 

我应该怎样对循环进行打印呢?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

只需切换for-loops

即可
...
if horiz_vert == "horizontal":
        for j in range(6):
            for i in input_text:
                print(letters[i][j], end = "")
            print()
...

<强>为什么吗

您的代码looping通过input_text中的每个字母,对于每封信,您printing rows没有new-line字符。

这是正确的想法,两个字母只会print出两条长线,而你想要的是它们并排在同一条线上。

您需要print每个字母(同一行)row,然后new-line(向下移动row的第二个rows字母)。

为此,我们需要遍历row,并为每个letters循环遍历input_text中的row。对于每个字母,打印new-line没有printing字符。最后,在row一个print的末尾,我们new-line rowprint()移至下一个letters

更新

从@ MohitC的回复中,我发现由于dictionarystring的定义方式存在问题。

您已定义它们,以便字母的每个row中的length可以是任意printing。这适用于vertically他们printing,但当horizontally他们spaces时,这意味着他们将被抵消。

要解决此问题,确实很容易。我们可以为每个row添加letter到每个26的末尾,但是说您已经定义了所有spaces个字母,这将非常繁琐。

为了更简单地做到这一点,我们可以使用ljust。这样,我们就可以在string的右侧添加正确数量的length,以使其成为某个"abc".ljust(10)

E.g。

"abc       "

print

因此我们可以将其添加到代码中,以便当我们row letter为每个row时,我们确保length是某个ljustrows)。因此,为简单起见,我会将length调整为15 length(这只是'A'字符中最长行的... if horiz_vert == "horizontal": for j in range(6): for i in input_text: print(letters[i][j].ljust(15), end = "") print() ... ):< / p>

wkhtmltopdf

答案 1 :(得分:0)

首先,您需要为特定字符设置所有列表字符串的大小:

letters = {"a": ["     ___      ",
                 "    /   \     ",
                 "   /  ^  \    ",
                 "  /  /_\  \   ",
                 " /  _____  \  ",
                 "/__/     \__\ "],
           "b": [".______   ",
                 "|   _  \  ",
                 "|  |_)  | ",
                 "|   _  <  ",
                 "|  |_)  | ",
                 "|______/  "]}

然后你的循环代码:

if horiz_vert == "horizontal":
    for j in range(6):
        for i in input_text:
            print(letters[i][j], end = "")
        print()

输出:

Input your string of text here: ab
Would you like horizontal or vertical? horizontal
     ___      .______   
    /   \     |   _  \  
   /  ^  \    |  |_)  | 
  /  /_\  \   |   _  <  
 /  _____  \  |  |_)  | 
/__/     \__\ |______/