A function that calculate the total cost of each order from a dictionary

Question:

I have a list of dictionaries that represent orders in an online store. Each dictionary contains keys for the order ID, customer ID, and a list of line items, where each line item is itself a dictionary containing keys for the product ID, quantity, and price

orders = [    
    {'order_id': 1, 'customer_id': 1001, 'line_items': [
        {'product_id': 'A001', 'quantity': 2, 'price': 10.00},
        {'product_id': 'B002', 'quantity': 1, 'price': 5.00},
        {'product_id': 'C003', 'quantity': 3, 'price': 2.50},
    ]},
    {'order_id': 2, 'customer_id': 1002, 'line_items': [
        {'product_id': 'D004', 'quantity': 1, 'price': 20.00},
        {'product_id': 'E005', 'quantity': 2, 'price': 15.00},
    ]},
    {'order_id': 3, 'customer_id': 1003, 'line_items': [
        {'product_id': 'F006', 'quantity': 4, 'price': 3.00},
        {'product_id': 'G007', 'quantity': 2, 'price': 5.00},
        {'product_id': 'H008', 'quantity': 1, 'price': 8.00},
    ]},
    {'order_id': 4, 'customer_id': 1004, 'line_items': [
        {'product_id': 'F006', 'quantity': 4, 'price': 3.00},
        {'product_id': 'G007', 'quantity': 2, 'price': 5.00},
        {'product_id': 'H008', 'quantity': 1, 'price': 8.00},
    ]},
    {'order_id': 5, 'customer_id': 1005, 'line_items': [
        {'product_id': 'F006', 'quantity': 4, 'price': 3.00},
        {'product_id': 'G007', 'quantity': 2, 'price': 5.00},
        {'product_id': 'H008', 'quantity': 1, 'price': 8.00},
    ]},
]

I want to calculate the total cost of each order and add it as a new key to each dictionary. You also want to add a new key called customer_name that contains the name of the customer associated with each order, which you can look up in a separate list of dictionaries that maps customer IDs to names (taking into consideration i don’t have all the customers name):

customers = [{'customer_id': 1001, 'name': 'Alice'},
             {'customer_id': 1002, 'name': 'Bob'},
             {'customer_id': 1003, 'name': 'Charlie'},
             {'customer_id': 1004, 'name': 'jack'}]

I tried thisn but it didnt work

for order in orders:
    for customer in customers:
        if order['customer_id'] == customer['customer_id']:
            print('Order id: ' + str(order['order_id']))
            print('Customer name: ' + customer['name'])
            total_price = 0
            for line_item in order['line_items']:
                total_price = line_item['quantity'] * line_item['price']
            print(total_price)
            print('-----------------------')

I am looking for something to return, something like 'total_cost': 32.5, 'customer_name': 'Alice'}, at the end of the order of the customer Alice

Asked By: SonioEl544

||

Answers:

I create a customer_map dictionary to map customer IDs to names. Then, I loop through the orders list to calculate the total cost of each order using map() and a lambda function. I add the total_cost and customer_name keys to each order dictionary, by looking up the customer name in the customer_map using the customer_id key.

customer_map = {customer['customer_id']: customer['name'] for customer in customers}
for order in orders:
    line_items = order['line_items']
    total_cost = sum(map(lambda item: item['quantity'] * item['price'], line_items))
    order['total_cost'] = total_cost
    customer_id = order['customer_id']
    # i get a KeyError when trying to look up the name of customer ID 1005 in the customer_map
    # but this should do
    if customer_id in customer_map:
        order['customer_name'] = customer_map[customer_id]
    else:
        order['customer_name'] = 'Unknown'

# note that i relocate the output in the same variable( i hope this is what you want )
print(orders)

# return

# orders = [
#     {'order_id': 1, 'customer_id': 1001, 'line_items': 
#      [{'product_id': 'A001', 'quantity': 2, 'price': 10.0},
#        {'product_id': 'B002', 'quantity': 1, 'price': 5.0}, 
#        {'product_id': 'C003', 'quantity': 3, 'price': 2.5}], 'total_cost': 32.5, 'customer_name': 'Alice'}, 
#     {'order_id': 2, 'customer_id': 1002, 'line_items': 
#      [{'product_id': 'D004', 'quantity': 1, 'price': 20.0}, 
#       {'product_id': 'E005', 'quantity': 2, 'price': 15.0}], 'total_cost': 50.0, 'customer_name': 'Bob'}, 
#     {'order_id': 3, 'customer_id': 1003, 'line_items':
#       [{'product_id': 'F006', 'quantity': 4, 'price': 3.0}, 
#        {'product_id': 'G007', 'quantity': 2, 'price': 5.0}, 
#        {'product_id': 'H008', 'quantity': 1, 'price': 8.0}], 'total_cost': 30.0, 'customer_name': 'Charlie'}, 
#     {'order_id': 4, 'customer_id': 1004, 'line_items': 
#      [{'product_id': 'F006', 'quantity': 4, 'price': 3.0}, 
#       {'product_id': 'G007', 'quantity': 2, 'price': 5.0}, 
#       {'product_id': 'H008', 'quantity': 1, 'price': 8.0}], 'total_cost': 30.0, 'customer_name': 'jack'}, 
#     {'order_id': 5, 'customer_id': 1005, 'line_items': 
#     [{'product_id': 'F006', 'quantity': 4, 'price': 3.0}, 
#      {'product_id': 'G007', 'quantity': 2, 'price': 5.0}, 
#      {'product_id': 'H008', 'quantity': 1, 'price': 8.0}], 'total_cost': 30.0, 'customer_name': 'Unknown'}]

You can read about map, lambda

Answered By: Ayb009
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.