2016-03-17 123 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)) 
相關問題