How to sort a list of dicts in Python
I'm using the MongoDB group function (it's similar to SQL's GROUP BY) to aggregate some results for my live-log-analyzer project. This function is pretty cool, but it does not sort the grouped data. Here is how to sort the data. (It is only one line of Python, but I have a hard time remembering how to do this.)
DATA is the output of the mongoDB group function. I want to sort this list of dicts by 'ups_ad'
.
from pprint import pprint
DATA = [
{u'avg': 2.9165000000000001,
u'count': 10.0,
u'total': 29.165000000000003,
u'ups_ad': u'10.194.154.49:80'},
{u'avg': 2.6931000000000003,
u'count': 10.0,
u'total': 26.931000000000001,
u'ups_ad': u'10.194.155.176:80'},
{u'avg': 1.9860909090909091,
u'count': 11.0,
u'total': 21.847000000000001,
u'ups_ad': u'10.195.71.146:80'},
{u'avg': 1.742818181818182,
u'count': 11.0,
u'total': 19.171000000000003,
u'ups_ad': u'10.194.155.48:80'}
]
data_sorted = sorted(DATA, key=lambda item: item['ups_ad'])
pprint(data_sorted)
Results:
[{u'avg': 2.9165000000000001, u'count': 10.0, u'total': 29.165000000000003, u'ups_ad': u'10.194.154.49:80'}, {u'avg': 2.6931000000000003, u'count': 10.0, u'total': 26.931000000000001, u'ups_ad': u'10.194.155.176:80'}, {u'avg': 1.742818181818182, u'count': 11.0, u'total': 19.171000000000003, u'ups_ad': u'10.194.155.48:80'}, {u'avg': 1.9860909090909091, u'count': 11.0, u'total': 21.847000000000001, u'ups_ad': u'10.195.71.146:80'}]References:
Update 2010-04-28: Apparently I didn't use Google properly when I first wrote this post. Searching today produced several sources for doing exactly this.
Related posts
- An example using Python's groupby and defaultdict to do the same task — posted 2014-10-09
- python enum types — posted 2012-10-10
- Python data object motivated by a desire for a mutable namedtuple with default values — posted 2012-08-03
- Python setdefault example — posted 2010-02-09
- How to conditionally replace items in a list — posted 2008-08-22
Comments
You can also do sorted(DATA, key=
operator.itemgettr('ups_ad'))
See also operator.attrgetter() and operator.methodcaller().