在Python中按日期对字典值列表进行排序

39
我有一个列表,当我遍历我的数据时,我将一个字典附加到它上面...我想按照其中一个字典键进行排序。 例如:
data = "data from database"
list = []
for x in data:
     dict = {'title':title, 'date': x.created_on}
     list.append(dict)

我想按照'date'值的相反顺序对列表进行排序

5个回答

85

您可以通过以下方式实现:

list.sort(key=lambda item:item['date'], reverse=True)

这绝对是一个更好的答案,因为避免了额外的导入,谢谢! - Elias

26
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)
    

例子:

>>> 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)]

或者
>>> 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)]

以下是namedtuple的内部结构:

>>> 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))

4
如果你喜欢简洁明了的东西:
data = "data from database"
sorted_data = sorted(
    [{'title': x.title, 'date': x.created_on} for x in data], 
    key=operator.itemgetter('date'),
    reverse=True)

这将是key=operator.itemgetter('date')或key=lambda x:x['date']。 - Stephan202
sorted()返回一个新的列表,因此在您的情况下可以用生成器表达式替换列表推导式(将[]替换为())。 - jfs

4

2

将数据(或数据的副本)直接排序并随后构建字典列表。使用适当的键函数(可能是operator.attrgetter)使用sorted函数进行排序。


关键在于 operator.itemgetter 实际上... 这比 lambda 更快。 - Jarret Hardie
如果你要对数据列表进行排序,那么使用attrgetter,因为你需要foo.created_on;如果你要对字典列表进行排序,那么使用itemgetter,因为你需要foo['date']。 - Tetha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接