Max
Max

Reputation: 129

Group python list of dictionaries by values

Given I have a list of dictionaries I want to create new list of lists grouping the dictionaries by the values of "price":

dicts = [
     { "name": "item1", "price": 10 },
     { "name": "item2", "price": 5 },
     { "name": "item3", "price": 10 },
     { "name": "item4", "price": 12 },
     { "name": "item5", "price": 12 },
     { "name": "item6", "price": 5 }
 ]

Should create:

grouped_dicts = [
     [{ "name": "item1", "price": 10 },
     { "name": "item3", "price": 10 }],
     [{ "name": "item2", "price": 5 },
     { "name": "item6", "price": 5 }],
     [{ "name": "item4", "price": 12 },
     { "name": "item5", "price": 12 }]
]

Is there a nice way of doing this?

Thanks

Upvotes: 1

Views: 554

Answers (2)

Leo
Leo

Reputation: 1835

As an alternative to the answer above, here is how you do it without an additional import:

d = {}

for item in dicts:
    d.setdefault(item['price'], []).append(item)

list(d.values())

Out:

[[{'name': 'item1', 'price': 10}, {'name': 'item3', 'price': 10}],
 [{'name': 'item2', 'price': 5}, {'name': 'item6', 'price': 5}],
 [{'name': 'item4', 'price': 12}, {'name': 'item5', 'price': 12}]]

Upvotes: 2

mad_
mad_

Reputation: 8273

You could use deaultdict

from collections import defaultdict
d=defaultdict(list)
for item in dicts:
        d[list(item.values())[-1]].append(item) 

Output:

defaultdict(list,
            {10: [{'name': 'item1', 'price': 10},
              {'name': 'item3', 'price': 10}],
             5: [{'name': 'item2', 'price': 5}, {'name': 'item6', 'price': 5}],
             12: [{'name': 'item4', 'price': 12},
              {'name': 'item5', 'price': 12}]})

If you just need the list then just extract the values of defaultdict

list(d.values())

Output:

[[{'name': 'item1', 'price': 10}, {'name': 'item3', 'price': 10}],
 [{'name': 'item2', 'price': 5}, {'name': 'item6', 'price': 5}],
 [{'name': 'item4', 'price': 12}, {'name': 'item5', 'price': 12}]]

Upvotes: 1

Related Questions