2016-03-17 124 views
1

我有包含发票对象的发票列表。 我想根据他们的日期订购这些对象并在下面使用。根据对象的属性(即使它们是NoneType)对Python中的对象列表进行排序

from operator import attrgetter 
invoices_list.sort(key=attrgetter('date')) 

这就是我得到的错误。

TypeError: can't compare FakeDatetime to NoneType 

我想根据日期升序的对象,无日期应该是第一个。然后其他人应该按照升序排列。

$ invoices_list[0].date 
$ FakeDatetime(2015, 7, 3, 0, 0) 
+2

显示美国'invoices_list'可能的内容? – Holt

+0

按排序顺序,您希望日期等于“无”的对象出现在哪里? –

+0

这意味着该列表中的元素之一有'无'日期 – Muctadir

回答

0

写一个知道如何比较FakeDateTimeNone对象,然后告诉sort()通过指定cmp关键字参数使用此功能自定义比较函数。

0

如果您有没有一些默认值(比如0),你可以这样做:既然你没有指定的FakeDatetime结构

invoices_list.sort(key=lambda invoice: invoice.get('date') if (invoice != None) else 0) 
0

,我会尽力为您解决问题与建在datetime模块中。

基本上,即使dateNone,也要排序列表。为了做到这一点,当你得到None日期时,你必须使用默认值。所以,在我的解决方案中,当我获得None日期时,我会尽可能使用最小的日期作为默认值。因此,所有含有None日期的元素都将放在排序列表的顶部。

import datetime 

def get_key(d): 
    return d.date if hasattr(d, 'date') and d.date is not None else datetime.date(datetime.MINYEAR, 1, 1) 

sorted(invoices_list, key=get_key) 
+0

'invoices_list [0] .date' 'FakeDatetime(2015,7,3,0,0)' –

+0

请解释。 – Muctadir

1

一个简单的密钥卷包会做的工作:

class DateKey(object): 
    def __init__(self, invoice): 
     self.value = invoice.date 
    def __lt__(self, other): 
     if not isinstance(other, (datetime.date, type(None))): 
      return NotImplemented 
     elif self.value is None: 
      return True 
     elif other.value is None: 
      return False 
     else: 
      return self.value < other.value 

,然后使用它:

invoices_list.sort(key=lambda i: DateKey(i)) 
相关问题