Home > Mobile >  Create a dictionary from list of dictionaries selecting specific values
Create a dictionary from list of dictionaries selecting specific values

Time:01-08

I have a list of dictionaries as below and I'd like to create a dictionary to store specific data from the list.

test_list = [
    {
        'id':1,
        'colour':'Red',
        'name':'Apple',
        'edible': True,
        'price':100
    },
    {
        'id':2,
        'colour':'Blue',
        'name':'Blueberry',
        'edible': True,
        'price':200
    },
    {
        'id':3,
        'colour':'Yellow',
        'name':'Crayon',
        'edible': False,
        'price':300
    }
]

For instance, a new dictionary to store just the {id, name, price} of the various items.

I created several lists:

id_list = []
name_list = []
price_list = []

Then I added the data I want to each list:

for n in test_list:
   id_list.append(n['id']
   name_list.append(n['name']
   price_list.append(n['price']

But I can't figure out how to create a dictionary (or a more appropriate structure?) to store the data in the {id, name, price} format I'd like. Appreciate help!

CodePudding user response:

If you don't have too much data, you can use this nested list/dictionary comprehension:

keys = ['id', 'name', 'price']
result = {k: [x[k] for x in test_list] for k in keys}

That'll give you:


{
  'id': [1, 2, 3],
  'name': ['Apple', 'Blueberry', 'Crayon'],
  'price': [100, 200, 300]
}

CodePudding user response:

I think a list of dictionaries is stille the right data format, so this:

test_list = [
    {
        'id':1,
        'colour':'Red',
        'name':'Apple',
        'edible': True,
        'price':100
    },
    {
        'id':2,
        'colour':'Blue',
        'name':'Blueberry',
        'edible': True,
        'price':200
    },
    {
        'id':3,
        'colour':'Yellow',
        'name':'Crayon',
        'edible': False,
        'price':300
    }
]

keys = ['id', 'name', 'price']
limited = [{k: v for k, v in d.items() if k in keys} for d in test_list]

print(limited)

Result:

[{'id': 1, 'name': 'Apple', 'price': 100}, {'id': 2, 'name': 'Blueberry', 'price': 200}, {'id': 3, 'name': 'Crayon', 'price': 300}]

This is nice, because you can access its parts like limited[1]['price'].

However, your use case is perfect for pandas, if you don't mind using a third party library:

import pandas as pd

test_list = [
    {
        'id':1,
        'colour':'Red',
        'name':'Apple',
        'edible': True,
        'price':100
    },
    {
        'id':2,
        'colour':'Blue',
        'name':'Blueberry',
        'edible': True,
        'price':200
    },
    {
        'id':3,
        'colour':'Yellow',
        'name':'Crayon',
        'edible': False,
        'price':300
    }
]

df = pd.DataFrame(test_list)

print(df['price'][1])
print(df)

The DataFrame is perfect for this stuff and selecting just the columns you need:

keys = ['id', 'name', 'price']
df_limited = df[keys]
print(df_limited)

The reason I'd prefer either to a dictionary of lists is that manipulating the dictionary of lists will get complicated and error prone and accessing a single record means accessing three separate lists - there's not a lot of advantages to that approach except maybe that some operations on lists will be faster, if you access a single attribute more often. But in that case, pandas wins handily.

  •  Tags:  
  • Related