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