from operator import itemgetter your_list.sort(key=itemgetter('date'), reverse=True)
Связанные примечания
не используют list
, dict
как имена переменной, они - встроенные имена в Python. Это делает Ваш код трудно для чтения.
Вы, возможно, должны были бы заменить словарь tuple
или collections.namedtuple
или пользовательский подобный структуре класс в зависимости от контекста
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))
Взгляните на источник __ init __
из форм.MultiValueField
:
def __init__(self, fields=(), *args, **kwargs):
super(MultiValueField, self).__init__(*args, **kwargs)
# Set 'required' to False on the individual fields, because the
# required validation will be handled by MultiValueField, not by those
# individual fields.
for f in fields:
f.required = False
self.fields = fields
Так что я бы перезаписал __ init __
возможно, примерно так:
def __init__(self, *args, **kwargs):
choices = kwargs.pop("choices",[])
super(InputAndChoiceField, self).__init__(*args, **kwargs)
self.fields = (
fields.CharField(),
fields.ChoiceField(choices=choices),
)
Возможно, вы даже захотите сделать super (MultiValueField, self) .__ init __ (* args, ** kwargs)
вместо super (InputAndChoiceField, self) .__ init __ (* args, ** kwargs)
, потому что вы устанавливаете поля самостоятельно, а не получаете их через параметры.
передача вариантов в виджете решила эту проблему для меня
class InputAndChoiceWidget(widgets.MultiWidget):
def __init__(self, attrs=None):
choices = [('a', 1), ('b', 2)]
widget = (widgets.TextInput(),
widgets.Select(choices=choices)
)
super(InputAndChoiceWidget, self).__init__(widget, attrs=attrs)