Estoy trabajando en un proyecto de menú de restaurante, hasta ahora creé mi menú de platos principales ... pero tengo problemas con una cosa, que es la duplicación (ejecute el código a continuación y pruébelo para ver lo que quiero decir); Quiero eliminar el artículo duplicado pero también quiero agregar la cantidad ingresada al artículo correspondiente en la lista, por ejemplo:

[1.Pesto Pasta, 2.Pizza, 3.Risto]

Si el usuario ingresó: 1 el primer artículo se agregará a una nueva lista llamada MiPedido, la lista MiPedido encapsula el artículo, el precio y la cantidad (esto es necesario para la factura) Entonces, el programa le preguntará al usuario sobre la cantidad. .supongamos que ingresó: 2

Y luego el usuario agregó un segundo artículo que también 1, e ingresó la cantidad para que sea 5. La lista de MyOrder será la siguiente:

[(1.Pesto Pasta, 2),(1.Pesto Pasta, 5)]

Pero, lo que quiero es agregar 2 + 5 y eliminar el elemento duplicado para que sea así

[(1.Pesto Pasta, 7)]

¿Cómo puedo hacer eso? por favor ayuda :(

global items
items = []
global OriginalPrice 
OriginalPrice = []
global numOfItems
numOfItems =[]
global MyOrder
MyOrder = []

def maindish():
dishes = {'1.Pink Sauce Chicken Pasta':2.950,'2.Cheesy Garlic Bread':0.850,'3.Pesto 
Pasta':3.250}
print("\n")
for key,val in dishes.items():
    print(f"{key} - {val}KD")

while True:
    choise = int(input('Enter dish: '))
    quantity = int(input('Enter how many dishes'))
    
    item = list(dishes)[choise-1] #extracting the key
    DishPrice = dishes[item] #extracting value
    
    items.append(item)
    numOfItems.append(quantity)
    OriginalPrice.append(DishPrice)
    a = str(input('N/Y'))
    if(a == 'n'):
        break
    else:
        return maindish()
    

   maindish()
   for i in zip(items,numOfItems):
   MyOrder.append(i)
   print(MyOrder)
0
user13619472 12 jul. 2021 a las 22:16

4 respuestas

La mejor respuesta

Puede declarar items como dict antes de su ciclo while True:

items = {}

Y luego reemplazar

items.append(item)
numOfItems.append(quantity)

Con

if item in items:
    items[item] += quantity
else:
    items[item] = quantity

Ahora los elementos serán un diccionario de dish : quantity y puedes recorrerlo con:

for dish, quantity in items.items():

Aunque es posible que desee cambiar el nombre de items a algo como dish_counts para mayor claridad.

4
Kraigolas 12 jul. 2021 a las 19:25

Las tuplas son definitivamente una mala elección para los datos que deben actualizarse continuamente. Mi sugerencia es usar un dictionary para almacenar los nombres de los platos (key) con las cantidades respectivas (value).

Primero que nada, en lugar de pasar por items y num_of_items, construiría un diccionario de item:quantity pares. Aquí hay un ejemplo simple de cómo implementaría esto.

# replace this:
items.append(item)
numOfItems.append(quantity)

# with this (assuming items as the dict):
if item in items:
    items[item] += quantity
else:
    items[item] = quantity

De manera similar, haría my_order un diccionario con la misma lógica, reemplazando así la definición de maindish() de la siguiente manera:

for dish, quantity in items.items():
    if dish in my_order:
        my_order[dish] += quantity
    else:
        my_order[dish] = quantity

Elija siempre tipos de datos mutables cuando realice muchas actualizaciones en su información.

Como nota al margen, le sugiero que intente seguir las buenas prácticas de PEP8, al menos cuando se trata de nombres de variables, es decir, use guiones bajos en lugar de mayúsculas y minúsculas para separar palabras.

1
Max Shouman 12 jul. 2021 a las 19:37

Puede generar los objetos de orden de la misma manera que imprime los dictados y la lista que también puede hacer con los objetos anulando el método __str__(), que devuelve una cadena ", que está integrada en todos los objetos en Python.

class Food:
# previous code and methods 
    def __str__(self):
        return self.name + str(self.price) + str(self.quantity) 
                + str(self.quantity*self.price)
class Order:
# previous code and methods 
    def __str__(self):
        output = "name | price | quantity | total \n"
        for key, value in self.orders.items():
            output += str(value) + "\n"
        return output

Puede cambiar el aspecto de la salida como solo manipulación de cadenas.

En el programa principal

person1 = # an order object with all their orders already added
print(person1) #will output result of ```__str__()```:
1
Issac Abraham 12 jul. 2021 a las 20:56

No puede actualizar los elementos porque está utilizando una tupla que no se puede editar. Puede utilizar otra lista, que se puede editar.

Recomiendo usar un diccionario en lugar de una lista 2d.

Un enfoque aún mejor es usar OOP para crear Order como un objeto, esto también le permite crear múltiples pedidos para varias personas. También debe crear una clase de Alimentos genérica o usar la herencia para hacer alimentos específicos.

class Food:
    def __init__(self, name, price, quantity):
        self.name =  name
        self.price = price
        self.quantity = quantity

    def increase_quantity(self, quantity):
        self.quantity += quantity
class Order:
    def __init__(self):
        self.order = {}
    
    def add_order(name, price, quantity):
        if name in self.orders:
            self.orders[name].increase_quantity(quantity)
        else:
            self.food1 = Food(name, price, qauntity)
        

En el código principal, puede crear tantos pedidos como desee

person1 = Order()
person2 = Order()
person1.add_order("pesto pasta" , 2.95, 1)
person1.add_order("pesto pasta" , 2.95, 5)
# now this person has order 6 pesto pastas
person2.add_order("chicken pasta" , 1.5, 2)
1
Issac Abraham 12 jul. 2021 a las 19:58