Print a receipt in Python that doesn't repeat the items

Question:

I need to create a function that creates a session that accepts a "clerk’s" input data about a customer’s orders until the "clerk" enters the string "/". Each line of input consists of two elements: the product code and the quantity. Lines of input are formatted as follows: "{product_code},{quantity}". The function should write a file called receipt.txt that prints a summarized report of the session.

The receipt should provide a summary of all the orders made during the session and the product must only appear once if it has been ordered at least once during the session, even if it has been ordered multiple times. In other words, if a product is ordered multiple times, then it should only have one entry in the receipt that describes the sum of all of the orders made for that product. The products must appear in alphabetical order.

Here is my code right now and it prints a receipt but I don’t know how to make the order appear only once and make it alphabetical order. Please help.

EDIT: Added get_property function.


def get_property(code,property):
    return products[code][property]

def main():
    
    products = {
    "americano":{"name":"Americano","price":150.00},
    "brewedcoffee":{"name":"Brewed Coffee","price":110.00},
    "cappuccino":{"name":"Cappuccino","price":170.00},
    "dalgona":{"name":"Dalgona","price":170.00},
    "espresso":{"name":"Espresso","price":140.00},
    "frappuccino":{"name":"Frappuccino","price":170.00},
    }
    
    orders_list = []
    total = 0
    
    while(True):
        
        customer_order = input("Welcome to the CoffeePython POS Terminal.nPlease enter the Product Code and the Quantity in this format - {Product Code},{Quantity}.nEnter '/' to quit.n")
        
        if customer_order == "/":
            break
             
        else:
            code_quantity_list = customer_order.split(",")
            code = code_quantity_list[0]
            quantity = code_quantity_list[1]
            quantity_int = int(quantity)
            
            if code in products:
                subtotal = get_property(code,"price")*quantity_int
                total += subtotal
                    
                ordered_item = dict([
                    ('code', code),                        
                    ('qty', quantity_int),                    
                    ('subtotal', subtotal)
                    ])
                
                orders_list.append(ordered_item)
                
            else:
                print("The Product Code that you entered is invalid. Please try again.")
                
    print("==")
    print("CODEtttNAMEtttQUANTITYtttSUBTOTAL")
    
    for order in orders_list:
        order_code = order['code']
        order_name = products[order_code]["name"]
        order_qty = order['qty']            
        order_subtotal = order['subtotal']
    
        print(f"{order_code}tt{order_name}tt{order_qty}tttt{order_subtotal}tt")   
    
    print(f"nTotal:tttttttttt{total}")
    print("==")
    print("Thank you for ordering. Goodbye.")

main()

Output

==
CODE            NAME            QUANTITY            SUBTOTAL
americano       Americano       2                   300.0       
americano       Americano       2                   300.0       

Total:                                              600.0
==
Asked By: pythonbeginner31

||

Answers:

When i test the code the item prints once and i did following:

  • frappuccino, 1
  • americano, 2
  • dalgona, 1

So i cannot reproduce the issue but i dont have the get_properties method either so maybe thats the issue.

As for printing the list in alphabetical order you should look to sort the list before looping and printing the reciept. You will find how you can achieve sort on a list containing dictionaries
here

Answered By: Tommi

To store the orders, I would suggest you to use a dictionary with code as a key, and the price as value.

orders_list = {}
while ...:
    orders_list[code] = orders_list.setdefault(code, 0) + subtotal

for product in sorted(orders_list):
    subtotal = orders_list[product]
    print(f"{product:<10} {subtotal}")
Answered By: nonin

You need to check the saved list in orders_list and then evaluate the existing key. For sort list in the order_list by key in a dict, you can use this reference

How do I sort a list of dictionaries by a value of the dictionary?

I am adding a new method to perform check.

Also, I am not sure about your get_property() method, I changed it a bit.

def check_code(orders_list, code):
    codes = []
    for i in orders_list:
        codes.append(i["code"])
    if(code in codes):
        return True, codes.index(code)
    else:
        return False, 0

def main():
    products = {
        "americano":{"name":"Americano","price":150.00},
        "brewedcoffee":{"name":"Brewed Coffee","price":110.00},
        "cappuccino":{"name":"Cappuccino","price":170.00},
        "dalgona":{"name":"Dalgona","price":170.00},
        "espresso":{"name":"Espresso","price":140.00},
        "frappuccino":{"name":"Frappuccino","price":170.00},
        }
    orders_list = []
    total = 0
    
    while(True):
        
        customer_order = input("Welcome to the CoffeePython POS Terminal.nPlease enter the Product Code and the Quantity in this format - {Product Code},{Quantity}.nEnter '/' to quit.n")
        
        if customer_order == "/":
            break
             
        else:
            code_quantity_list = customer_order.split(",")
            code = code_quantity_list[0]
            quantity = code_quantity_list[1]
            quantity_int = int(quantity)
            
            if code in products:
                # subtotal = get_property(code,"price")*quantity_int
                subtotal = products[code]["price"] *quantity_int
                
                check = check_code(orders_list, code)
                if check[0]:
                    orders_list[check[1]]["subtotal"] += subtotal
                    orders_list[check[1]]["qty"] += quantity_int
                else:
                    ordered_item = dict([
                        ('code', code),                        
                        ('qty', quantity_int),                    
                        ('subtotal', subtotal)
                        ])
                    
                    orders_list.append(ordered_item)
                
                total += subtotal
                
            else:
                print("The Product Code that you entered is invalid. Please try again.")
                
    print("==")
    print("CODEtttNAMEtttQUANTITYtttSUBTOTAL")
    orders_list = sorted(orders_list, key=lambda k: k['code']) 

    for order in orders_list:
        order_code = order['code']
        order_name = products[order_code]["name"]
        order_qty = order['qty']            
        order_subtotal = order['subtotal']
    
        print(f"{order_code}tt{order_name}tt{order_qty}tttt{order_subtotal}tt")   
    
    print(f"nTotal:tttttttttt{total}")
    print("==")
    print("Thank you for ordering. Goodbye.")

main()

Answered By: Rizquuula
Traceback (most recent call last):
  File "run.py", line 72, in <module>
    subtotal = pizza[0]["price"] *quantity_int
TypeError: string indices must be integers

why am i getting this error

Answered By: Uncle bob
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.