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.
2
3 answers
Existem alguns utilitários super úteis para formatação de texto: ljust
|rjust
, para este tipo de coisas.
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:
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