Append dict to list of dicts with counter

Question:

I have this code:

def create_list(order_list):
    items_list = []
    for order in order_list:
        for o in order['items']:
            items_list.append(
                {'orderId': order['orderId'], 'name': o['name']} # add count of o['name']
            )
    
    return items_list
    
    
orders = [{'orderId': '1', 'items': 
            [
                {'name': 'sample', 'other_params': '1'}, 
                {'name': 'sample2', 'other_params': '2'}, 
                {'name': 'sample3', 'other_params': '3'}, 
                {'name': 'sample'}
            ]
        }]

tryme = create_list(orders)

print(tryme)

And the output is:

[{'orderId': '1', 'name': 'sample'}, {'orderId': '1', 'name': 'sample2'}, {'orderId': '1', 'name': 'sample3'}, {'orderId': '1', 'name': 'sample'}]

But the {'orderId': '1', 'name': 'sample'} repeated. How do I make it so that it doesn’t repeat and also be able to print the count of the occurrences of each dict.

For example instead of having two {'orderId': '1', 'name': 'sample'}, I can just have {'orderId': '1', 'name': 'sample', 'count': 2}.

Also, is there a way to remove the nested for-loop?

Asked By: Prosy Arceno

||

Answers:

You didn’t mentioned anything about what happens to the other_params, so I just ignored them and converted your orders into the format you wanted.

def convert_list(input_list):
  # Initialize an empty output list
  output_list = []

  # Iterate over the input list
  for item in input_list:
    # Get the order ID
    order_id = item['orderId']

    # Iterate over the list of items
    for i in item['items']:
      # Check if the current item is already in the output list
      exists = False
      for j in output_list:
        if j['name'] == i['name']:
          # If it exists, increment the count and set the flag
          j['count'] += 1
          exists = True
      if not exists:
        # If the item doesn't exist, add it to the output list with a count of 1
        output_list.append({'orderId': order_id, 'name': i['name'], 'count': 1})

  # Return the output list
  return output_list
Answered By: Raya