关于django:在python中按日期排序字典值列表

sorting a list of dictionary values by date in python

我有一个列表,当我循环我的数据时,我在给它添加一个字典……我想按其中一个字典键排序。

前任:

1
2
3
4
5
data ="data from database"
list = []
for x in data:
     dict = {'title':title, 'date': x.created_on}
     list.append(dict)

我想按"日期"值的相反顺序对列表进行排序


你可以这样做:

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

1
2
3
from operator import itemgetter

your_list.sort(key=itemgetter('date'), reverse=True)

号相关说明

  • 不要使用listdict作为变量名,它们是python中内置的名称。这会使代码难以读取。

  • 根据上下文,您可能需要用tuplecollections.namedtuple或自定义结构类替换字典。

    1
    2
    3
    4
    5
    6
    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)

例子:

1
2
3
4
>>> 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)]

1
2
3
4
5
>>> 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的内部情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
>>> 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))


我昨天确实有一个几乎完全准确的问题,并通过搜索解决了它。适用于您的问题的最佳答案是:

1
2
from operator import itemgetter
list.sort(key=itemgetter('date'), reverse=True)

如果你喜欢简洁的东西:

1
2
3
4
5
data ="data from database"
sorted_data = sorted(
    [{'title': x.title, 'date': x.created_on} for x in data],
    key=operator.itemgetter('date'),
    reverse=True)


直接对数据(或数据副本)进行排序,然后构建听写列表。使用用适当键函数排序的函数进行排序(可能是operator.attrgetter)