sorting a list of dictionary values by date in python

后端 未结 5 1251
遥遥无期
遥遥无期 2020-12-24 13:29

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 = \         


        
相关标签:
5条回答
  • 2020-12-24 13:53

    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)
    
    0 讨论(0)
  • 2020-12-24 13:55
    from operator import itemgetter
    
    your_list.sort(key=itemgetter('date'), reverse=True)
    

    Related notes

    • 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))
    
    0 讨论(0)
  • 2020-12-24 14:06

    You can do it this way:

    list.sort(key=lambda item:item['date'], reverse=True)
    
    0 讨论(0)
  • 2020-12-24 14:08

    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)

    0 讨论(0)
  • 2020-12-24 14:11

    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)
    
    0 讨论(0)
提交回复
热议问题