I have a list and I am appending a dictionary to it as I loop through my data...and I would like to sort by one of the dictionary keys.
ex:
data = \
If you're into the whole brevity thing:
data = "data from database"
sorted_data = sorted(
[{'title': x.title, 'date': x.created_on} for x in data],
key=operator.itemgetter('date'),
reverse=True)
from operator import itemgetter
your_list.sort(key=itemgetter('date'), reverse=True)
don't use list, dict as variable names, they are builtin names in Python. It makes your code hard to read.
you might need to replace dictionary by tuple or collections.namedtuple or custom struct-like class depending on the context
from collections import namedtuple
from operator import itemgetter
Row = namedtuple('Row', 'title date')
rows = [Row(row.title, row.created_on) for row in data]
rows.sort(key=itemgetter(1), reverse=True)
Example:
>>> lst = [Row('a', 1), Row('b', 2)]
>>> lst.sort(key=itemgetter(1), reverse=True)
>>> lst
[Row(title='b', date=2), Row(title='a', date=1)]
Or
>>> from operator import attrgetter
>>> lst = [Row('a', 1), Row('b', 2)]
>>> lst.sort(key=attrgetter('date'), reverse=True)
>>> lst
[Row(title='b', date=2), Row(title='a', date=1)]
Here's how namedtuple looks inside:
>>> Row = namedtuple('Row', 'title date', verbose=True)
class Row(tuple):
'Row(title, date)'
__slots__ = ()
_fields = ('title', 'date')
def __new__(cls, title, date):
return tuple.__new__(cls, (title, date))
@classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new Row object from a sequence or iterable'
result = new(cls, iterable)
if len(result) != 2:
raise TypeError('Expected 2 arguments, got %d' % len(result))
return result
def __repr__(self):
return 'Row(title=%r, date=%r)' % self
def _asdict(t):
'Return a new dict which maps field names to their values'
return {'title': t[0], 'date': t[1]}
def _replace(self, **kwds):
'Return a new Row object replacing specified fields with new values'
result = self._make(map(kwds.pop, ('title', 'date'), self))
if kwds:
raise ValueError('Got unexpected field names: %r' % kwds.keys())
return result
def __getnewargs__(self):
return tuple(self)
title = property(itemgetter(0))
date = property(itemgetter(1))
You can do it this way:
list.sort(key=lambda item:item['date'], reverse=True)
Sort the data (or a copy of the data) directly and build the list of dicts afterwards. Sort using the function sorted with an appropiate key function (operator.attrgetter probably)
I actually had this almost exact question yesterday and solved it using search. The best answer applied to your question is this:
from operator import itemgetter
list.sort(key=itemgetter('date'), reverse=True)