2017-09-13 59 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}")