[英]sort a list of objects in Python, based on an attribute (even they are NoneType) of the objects
我有包含發票對象的發票列表。 我想根據它們的日期和下面的使用來訂購這些對象。
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)
一個簡單的密鑰包裝器將完成這項工作:
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))
編寫一個自定義比較函數,該函數知道如何比較FakeDateTime
和None
對象,然后通過指定cmp
關鍵字參數告訴sort()
使用此函數。
如果您有一些 None 的默認值(例如 0),您可以執行以下操作:
invoices_list.sort(key=lambda invoice: invoice.get('date') if (invoice != None) else 0)
由於您尚未指定FakeDatetime
的結構,我將嘗試使用內置的datetime
模塊來解決您的問題。
基本上,即使date
是None
,您也想對列表進行排序。 為此,您必須在獲得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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.