Differences between revisions 8 and 9
 ⇤ ← Revision 8 as of 2003-12-26 02:20:59 → Size: 877 Editor: ti211310a080-4332 Comment: l should be decorated ← Revision 9 as of 2004-09-07 02:40:18 → ⇥ Size: 1348 Editor: Raymond Hettinger Comment: Deletions are marked like this. Additions are marked like this. Line 24: Line 24: sorted = [dict_ for (key, dict_) in decorated] result = [dict_ for (key, dict_) in decorated] Line 28: Line 28: Starting with Py2.4 the {{{list.sort()}}} method provides a {{{key=}}} argument for doing the transform in a single step. The new {{{sorted()}}} built-in function goes a step further and encapsulates making a new sorted list while leaving the original intact. Also, the new {{{operator.itemgetter()}}} function helps by constructing functions for key access:{{{>>> from operator import itemgetter>>> result = sorted(undecorated, key=itemgetter('key2'))}}}

# Sorting Lists of Dictionaries

Frequently you want to sort a list of dictionaries, based on some particular key.

For example:

```   1 a = {"key1": 5 , "key2": 8, "key3": 2}
2 b = {"key1": 7 , "key2": 4, "key3": 9}
3 c = {"key1": 6 , "key2": 1, "key3": 1}
4 undecorated = [a, b, c] # how do you sort this list?
```

There are many ways to do this. Here's the fastest way to do it, as it avoids using a custom comparison function, instead using builtin comparisons. This is the decorate-sort-undecorate pattern, or the Schwartzian transform if you're coming from Perl.

```   1 sort_on = "key2"
2 decorated = [(dict_[sort_on], dict_) for dict_ in undecorated]
3 decorated.sort()
4 result = [dict_ for (key, dict_) in decorated]
```

(The variable was named dict_ because dict is already a builtin.)

Starting with Py2.4 the list.sort() method provides a key= argument for doing the transform in a single step. The new sorted() built-in function goes a step further and encapsulates making a new sorted list while leaving the original intact. Also, the new operator.itemgetter() function helps by constructing functions for key access:

```>>> from operator import itemgetter
>>> result = sorted(undecorated, key=itemgetter('key2'))```

SortingListsOfDictionaries (last edited 2010-03-30 19:08:00 by wl-ol-s246-130)

Unable to edit the page? See the FrontPage for instructions.