Отфильтровать список объектов по атрибуту со временем
Список объектов:
[Operation(441945886, 26.08.2019, EXECUTED), Operation(41428829, 03.07.2019, EXECUTED), Operation(939719570, 30.06.2018, EXECUTED), ...]
Надо его отфильтровать по дате так, чтобы в начале списка находились самые последние операции.
Сам класс:
class Operation():
def __init__(self, oper_id, state, date, operationAmount, description, from_card, to_card):
self.oper_id = oper_id
self.state = state
self.date = self.fix_date(date)
self.operationAmount = operationAmount
self.description = description
self.from_card = from_card
self.to_card = to_card
def fix_date(self, date):
if isinstance(date, str):
dt = datetime.fromisoformat(date)
return dt.strftime('%d.%m.%Y')
else:
return None
...
Ответы (2 шт):
Автор решения: strawdog
→ Ссылка
Если вам необходимо хранить дату в экземпляре класса в виде строки, то можно сделать сортировку так. например:
lst = [Operation(41428829, "03.07.2019", "EXECUTED"), Operation(939719570, "30.06.2018", "EXECUTED"), Operation(441945886, "26.08.2019", "EXECUTED")]
lst = sorted(lst, key=lambda x:datetime.strptime(x.date, '%d.%m.%Y'), reverse=True)
for i in lst:
print(i.oper_id)
441945886
41428829
939719570
Если же время можно хранить в формате datetime, то ту же сортировку можно сделать проще:
lst = sorted(lst, key=lambda x:x.date, reverse=True)
Автор решения: dofi4ka
→ Ссылка
Для сортировки по дате можно дополнительно хранить timestamp в экземпляре класса и по нему уже сравнивать
class Operation:
def __init__(self, oper_id, date):
self.oper_id = oper_id
self.date, self.timestamp = self.fix_date(date)
def fix_date(self, date):
if isinstance(date, str):
dt = datetime.fromisoformat(date)
return dt.strftime('%d.%m.%Y'), dt.timestamp()
else:
return None, 0
def __repr__(self):
return f"{self.__class__.__name__}({self.oper_id}, {self.date})"
example_list = [
Operation(441945886, "2019-08-26"),
Operation(41428829, "2018-06-30"),
Operation(939719570, "2019-07-03")
]
print(
sorted(example_list, key=lambda o: o.timestamp, reverse=True)
)