Criar um menu restaurante / pizza em python, com um bom layout

Sou novo no python e gostaria de criar um sistema de encomenda de Pizza usando python, que se parece com isto.

1   Hawaiian                      $7.50
2   Champagne Ham & Cheese        $7.50
3   Beef & Onion                  $7.50
4   Pepperoni                     $7.50
5   Simply Cheese                 $7.50
6   Bacon & Mushroom              $7.50
7   Italiano                      $7.50
8   The Deluxe                    $13.50  
9   Ham, Egg & Hollandaise        $13.50
10  Americano                     $13.50
11  Mr Wedge                      $13.50
12  BBQ Meatlovers                $13.50

Eu gostaria então que o cliente fosse capaz de selecionar pizzas diferentes com base no número para que eles não tenham que digitar Havaiano, eles podem em vez de tipo 1. Eu tentei tanto dicionários e listas, mas sempre resultou neste problema:

1  Hawaiian $7.50
2  Champagne Ham & Cheese$7.50
3  Beef & Onion $7.50
4  Pepperoni $7.50
5  Simply Cheese $7.50
6  Bacon & Mushroom $7.50
7  Italiano $7.50
8  The Deluxe $13.50 
9  Ham, Egg & Hollandaise $13.50
10  Americano $13.50
11  Mr Wedge $13.50 
12  BBQ Meatlovers $13.50
Onde os preços "se manteriam no nome da piza" e os nomes das pizzas 10 em diante foram marcados por uma personagem. Colocar espaços manualmente não parece ser a maneira mais eficiente de resolver o meu problema. e. g

standardprice = "$7.50"
    deluxeprice = "13.50"
    print (
    """   
1   Hawaiian                      %s
2   Champagne Ham & Cheese        %s
3   Beef & Onion                  %s
4   Pepperoni                     %s
5   Simply Cheese                 %s
6   Bacon & Mushroom              %s
7   Italiano                      %s
8   The Deluxe                    %s  
9   Ham, Egg & Hollandaise        %s
10  Americano                     %s
11  Mr Wedge                      %s
12  BBQ Meatlovers                %s
     """  % (standardprice, standardprice, standardprice, standardprice, 
             standardprice, standardprice, standardprice,deluxeprice,            
             deluxeprice,deluxeprice, deluxeprice, deluxeprice)
        )
Há uma maneira mais fácil de resolver o meu problema? Também como uma questão lateral quando a impressão existe uma maneira que a variável "standardprice" se aplica aos primeiros 7 elementos e o preço de luxo se aplica a 8-12, ao invés da maneira crua que eu fiz isso.

Aqui teve um problema um pouco similar mas a página não ajudou.Academias De Código "Um dia no tutorial do supermercado " também não foi particularmente útil. Sou muito novo no python, por isso explicar como sei que nada seria muito útil.

Author: Community, 2015-05-02

3 answers

Existem alguns utilitários super úteis para formatação de texto: ljust|rjust, para este tipo de coisas.

Aqui está um exemplo rápido que eu criei usando {[[1]}, mas não pare aqui; dê uma olhada no doc conectado acima e deixe sua imaginação ficar louca com a formatação de cordas-liberdade!
from collections import namedtuple

MenuEntry = namedtuple('MenuEntry', ['index','description','price'])
_menu = []
_menu.append(MenuEntry(1, 'Hawaiian', '$7.50'))
_menu.append(MenuEntry(2, 'Champagne Ham & Cheese', '$7.50'))
_menu.append(MenuEntry(3, 'Beef & Onion', '$7.50'))
_menu.append(MenuEntry(40, 'Pepperoni', '$10.50'))
_menu.append(MenuEntry(100, 'Simply Cheese', '$17.50'))

for entry in _menu:
    index = str(getattr(entry,'index')).ljust(5)
    descr = getattr(entry,'description').ljust(25)
    price = getattr(entry,'price').ljust(7)
    print '{0}{1}{2}'.format(index,descr,price)

""" Output: """

1    Hawaiian                 $7.50  
2    Champagne Ham & Cheese   $7.50  
3    Beef & Onion             $7.50  
40   Pepperoni                $10.50 
100  Simply Cheese            $17.50 

""""""""""""""""""""""""""""
 1
Author: MrDuk, 2015-05-02 08:18:48
Aqui está um exemplo de trabalho, mas eu usei a biblioteca para poupar muita dor. Reveja os comentários primeiro se você puder / quiser, em seguida, responder se você tiver outras perguntas. É certo que isto não é para principiantes, mas excepto para a parte de formatação do DataFrame, é bastante básico.
import pandas as pd

pizzas = [
    "Hawaiian",
    "Champagne Ham & Cheese",
    "Beef & Onion",
    "Pepperoni",
    "Simply Cheese",
    "Bacon & Mushroom",
    "Italiano",
    "The Deluxe",
    "Ham, Egg & Hollandaise",
    "Americano",
    "Mr Wedge",
    "BBQ Meatlovers"
    ]

df = pd.DataFrame(pizzas, columns=["Pizzas"])
df.loc[:8, "Prices"] = 7.50     # First 7 items.
df.loc[8:, "Prices"] = 13.50    # All the rest.
df.index += 1                   # So that it's not zero-indexed.
total_bill = 0.0                # Meh.

print "Welcome to Pizza Planet!" # So unoriginal, I know.
print
print "Here's our menu!"
print
# Following method taken and modified from unutbu's amazing answer
# here: http://stackoverflow.com/questions/25777037
print df.to_string(justify='left',
                   header=False,
                   formatters={
                    'Pizzas':'{{:<{}s}}'.format(
                        df['Pizzas'].str.len().max()
                        ).format,
                    'Prices':'     ${:.2f}'.format})
print
print "Input a number and press enter to select an item."
print "Input 'done' to finish your order and tabulate your bill."
print "Input 'exit' to cancel your orders."

while True:

    order = raw_input(">>>  ")

    if order == 'exit':
        break
    elif order == 'done':
        print "Your total bill is ${:.2f}.".format(total_bill)
        raw_input("Press any key to exit.")
        break
    elif int(order) in df.index:
        item = df.loc[int(order), "Pizzas"]     # Get the respective items
        price = df.loc[int(order), "Prices"]    # by indexing order input.
        print "You've selected {}! That would be ${:.2f}.".format(item, price)
        total_bill += price
        continue
    else:
        print "Don't be an idiot." # :-)
        raw_input("Press any key to exit.")
        break
Resultado:

enter image description here

 0
Author: Manhattan, 2015-05-02 07:40:40
Aqui está uma versão rápida e suja, você deve, naturalmente, fazer algumas verificações para evitar erros. Mas isto vai funcionar.
from collections import OrderedDict

thatsALowPrice = 7.50
thatsAHighPrice = 10.50

myMenu = OrderedDict()

myMenu["Sandwich"] = thatsALowPrice
myMenu["Burger"] = thatsALowPrice
myMenu["Steak"] = thatsAHighPrice

i=1
for k, v in myMenu.items():
    print(i, ":", k, "\t\t", v)
    i+=1

itemNumber = int(input("Choose your item: "))
item=list(myMenu.items())[itemNumber-1]

print("You chose", item[0], "at a price of: $"+str(item[1]))
 -1
Author: connorjan, 2015-05-02 05:09:10