我希望能够通过一个属性对类列表进行排序,这恰好是另一个类Date。我做了一些研究,并希望使用sorted(list, key=lambda x:date)
排序方法,但看到日期本身就是一个类,我如何在日期中编写__lt__
函数以允许我按时间顺序排序?
我想要的是:
if self.year!= other.year:
return self.year < other.year
elif self.month != pther.month
...
等等。
这是我的日期类:
class Date:
def __init__(self, month, day, year, minute, hour, string):
self.month = month
self.day = day
self.year = year
self.minute = minute
self.hour = hour
self.string = string
我应该提一下,这是我第一次使用Python,所以我对此并不擅长。
提前致谢!
答案 0 :(得分:2)
比较两个复杂数据结构的简单方法是以正确的排序顺序比较其属性的元组。试试这个:
class Date:
def __init__(self, month, day, year, minute, hour, string):
self.month = month
self.day = day
self.year = year
self.minute = minute
self.hour = hour
self.string = string
def __lt__(self, other):
return (self.year, self.month, self.day, self.hour, self.minute) < \
(other.year, other.month, other.day, other.hour, other.minute)
assert Date(4, 15, 2016, 30, 12, '') < \
Date(4, 16, 2016, 0, 0, '') < \
Date (1, 1, 2017, 59, 23, '')
assert not (Date(4, 16, 2016, 0, 0, '') < Date(4, 15, 2016, 30, 12, ''))
当然,这只会实现<
。根据代码的性质,您可能希望实现所有其他比较函数>
,==
,!=
等。一种方便的方法是使用@functools.total_ordering
类装饰器。
参考:
答案 1 :(得分:1)
我建议在类定义中添加datetime
对象:
import datetime as dt, operator as op
class MyDate(object):
def __init__(self, month, day, year, minute, hour, string):
self.month = month
self.day = day
self.year = year
self.minute = minute
self.hour = hour
self.string = string
self.dt = dt.datetime(self.year,self.month,self.day,self.hour,self.minute)
l = []
l.append(MyDate(2,17,2017,33,16,'somestring')) # not sure what `string` should be
l.append(MyDate(2,17,2017,37,16,'anotherstring'))
l.append(MyDate(2,17,2017,38,16,'yetanotherstring'))
然后您可以使用operator.attgetter
进行排序,例如:
>>> sorted(l,key=op.attrgetter('dt'),reverse=True)
[<__main__.MyDate object at 0x000000000A4C84A8>,
<__main__.MyDate object at 0x000000000A4C8208>,
<__main__.MyDate object at 0x000000000A4C8978>]