2017-10-16 138 views
3

这里是我当前的代码:打印列表水平

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() 
目前

,如果你的INPUT_TEXT输入“AB”,做你会得到下面的输出垂直打印选项:

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

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

但是当你键入的水平我想下面的输出:

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

我应该怎么做才能厕所让它像那样打印?

感谢您的帮助!

+1

主要是你要切换'i'和'j'循环,也许添加一些空间艺术的 –

+0

工作,人。 – MohitC

+0

如果你使每行的ASCII字母的宽度相同,这可能会有所帮助。 – mkrieger1

回答

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并为每个字母,你是printingrows没有new-line字符。

这是正确的想法,两个字母将只是print在两个长行,而你想要的是他们并排在同一行。

需要print相同row从每个字母(在同一行)的方式,然后new-line(向下移动的信件的第二row)。

要做到这一点,我们需要遍历rows和每个row,通过input_text中的letters循环。并且对于每个字母,打印row而没有new-line字符。最后,在printing一个row的末尾,我们print a new-line移动到下一个rowprint()

更新:

从@ MohitC的反应,我知道会有一个问题,由于letters如何在dictionary定义。

您已经定义了它们,以便每个row中的string可以是任何length。这对printing他们vertically很好,但是当他们printing他们horizontally,这将意味着他们将被抵消。

修复此问题的方法是真的容易。我们可以通过在每个row的末尾添加spaces来获得每个letter,但是假设您已经定义了所有的26字母,这将是令人难以置信的单调乏味。我们可以使用ljust来做到这一点。这允许我们在string的右侧添加正确数量的spaces,以使其成为特定的length

例如,

"abc".ljust(10) 

"abc  " 

如此这样,当我们printrow每个letter,我们确保了row一定length(与ljust),我们可以添加到代码这一点。所以为了简单起见,我会调整所有rowslength15(这只是在'A'字符最长行的length):

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

似乎没有工作 – MohitC

+0

按预期工作:) – Gennaro

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 
    ___  .______ 
    / \  | _ \ 
/^ \ | |_) | 
//_\ \ | _ < 
/_____ \ | |_) | 
/__/  \__\ |______/