2017-09-13 66 views
2

我現在有如下產生輸出下面的代碼(蟒蛇):如何左對齊和分隔此打印語句中某些值的輸出?

MENU = [["Hawaiian", 8.50], ["Pepperoni", 8.50], ["Veg Trio", 8.50], ["Simply Cheese", 8.50], ["Meat Lovers", 8.50], ["Ham & Cheese", 8.50], ["BBQ Italian Sausage", 8.50], 
    ["Loaded Supreme", 13.50], ["Chicken Fajita", 13.50], ["Apricot Chicken", 13.50], ["Garlic Prawn", 13.50], ["Chicken Cranberry", 13.50]] 

print("\nWe sell the following pizzas.") 
for i, pizza in enumerate(MENU): 
    print("{}: {}: ${:.2f}".format(str(i+1).zfill(2), MENU[i][0], MENU[i][1])) 

Output of this code

如何讓這個所有的價格都在各種各樣的自己的「欄」並左對齊?我已經嘗試了一些在這裏發佈的類似問題的答案方法,但我無法實現我想要達到的目標。

我試過使用我在這裏找到的方法,但他們所做的全部工作是擴大冒號和價格之間的差距,每個單獨列的數量相同,當然不會使它們全部排隊。

我只是在學習,所以任何幫助將不勝感激!

+0

這將是相當痛苦和煩惱與您的打印聲明。但是,您可以編寫一個算法,計算名稱後需要多少空間,以便它們可以對齊。 –

+0

有沒有辦法可以修改我的打印語句,以便更容易完成? – Devin

+0

我不這麼認爲,但即使您仍然需要自己編寫代碼,這會使您重新計算一個算法,計算在名稱後插入多少空格,以便價格保持一致。 –

回答

0

你可以查找比薩最長的名稱,然後在空格填寫的名稱和價格之間的較短的名稱:

MENU = [["Hawaiian", 8.50], ["Pepperoni", 8.50], ["Veg Trio", 8.50], ["Simply Cheese", 8.50], ["Meat Lovers", 8.50], ["Ham & Cheese", 8.50], ["BBQ Italian Sausage", 8.50], 
    ["Loaded Supreme", 13.50], ["Chicken Fajita", 13.50], ["Apricot Chicken", 13.50], ["Garlic Prawn", 13.50], ["Chicken Cranberry", 13.50]] 

# Get a list of the lengths of the pizza names 
menu_name_lengths = [len(k[0]) for k in MENU] 

# Get the length of the longest name 
max_length = max(menu_name_lengths) 

# (max_length-len(pizza[0])) gives the number of spaces to fill in the gap 
for i, pizza in enumerate(MENU): 
    print("{} {}:{} ${:.2f}".format(str(i+1).zfill(2), pizza[0], " "*(max_length-len(pizza[0])), pizza[1])) 

打印出:

01 Hawaiian:   $8.50 
02 Pepperoni:   $8.50 
03 Veg Trio:   $8.50 
04 Simply Cheese:  $8.50 
05 Meat Lovers:   $8.50 
06 Ham & Cheese:  $8.50 
07 BBQ Italian Sausage: $8.50 
08 Loaded Supreme:  $13.50 
09 Chicken Fajita:  $13.50 
10 Apricot Chicken:  $13.50 
11 Garlic Prawn:  $13.50 
12 Chicken Cranberry: $13.50 
+0

您!完美工作:) – Devin

+0

它是一個列表理解,它遍歷列表MENU中的每個元素k並獲取k的第一個元素的長度,並將其放入一個名爲menu_name_lengths的新列表中。請參閱[list-comprehensions](https://docs.python.org/3/tutorial/datastructures。來自Python文檔的html#list-comprehensions)。 – Igle

0

您可以使用str.format來選擇行的每個元素之間的間距,這將創建您正在查找的列。 {:>15}表示告訴字符串在右側顯示15個空格。但是,右欄仍然沒有對齊,但我正在爲此尋找解決方案,一旦找到答案就會編輯此答案,但您可以在試用期中嘗試此方法。

MENU = [["Hawaiian", 8.50], ["Pepperoni", 8.50], ["Veg Trio", 8.50], ["Simply Cheese", 8.50], ["Meat Lovers", 8.50], ["Ham & Cheese", 8.50], ["BBQ Italian Sausage", 8.50], 
    ["Loaded Supreme", 13.50], ["Chicken Fajita", 13.50], ["Apricot Chicken", 13.50], ["Garlic Prawn", 13.50], ["Chicken Cranberry", 13.50]] 

print("\nWe sell the following pizzas.") 
for i, pizza in enumerate(MENU): 
    line = '{:>12} {:>5} {:>15}'.format(str(i+1).zfill(2), MENU[i][0], MENU[i][1]) 
    print(line) 
+0

感謝您的幫助:) – Devin

+0

沒問題的人,我渴望自己找到一個工作解決方案。正如你在輸出中看到的那樣,行的每個元素之間的間距是恆定的,所以我試圖找到一種方法來使最後的間距「{:> 15}」根據以前元素的長度而變化。 –

0

您可以通過一些改變來簡化一些事情。

對@Igle使用類似的方法,找到最大長度可能是最好的方法,但使用內置填充而不是手動添加空格更清晰。

前的Python 3.6

MENU = [["Hawaiian", 8.50], 
     ["Pepperoni", 8.50], 
     ["Veg Trio", 8.50], 
     ["Simply Cheese", 8.50], 
     ["Meat Lovers", 8.50], 
     ["Ham & Cheese", 8.50], 
     ["BBQ Italian Sausage", 8.50], 
     ["Loaded Supreme", 13.50], 
     ["Chicken Fajita", 13.50], 
     ["Apricot Chicken", 13.50], 
     ["Garlic Prawn", 13.50], 
     ["Chicken Cranberry", 13.50] 
    ] 

print("\nWe sell the following pizzas.") 

# Add 2 is optional but it makes the column a bit clearer. 
mlen = max(len(p[0]) for p in MENU) + 2 

for i, pizza in enumerate(MENU, 1): # Include the 1 to remove the +1 in the rest of the code 
    print("{{:02d}}: {{:<{}}} ${{:>5.2f}}" 
      .format(mlen) # Use multiple formats so that the padding is dynamic 
      .format(i, pizza[0]+':', pizza[1]) # Use pizza rather than MENU[i] 
    ) 

對於Python3.6與fstrings,一切變得簡單一點,你可以添加動態格式,而不是直接使用兩步

# ... same set up as above 
for i, pizza in enumerate(MENU, 1): 
    print(f"{i:02d}: {pizza[0]+':':<{mlen}} ${pizza[1]:>5.2f}")