簡體   English   中英

根據對象的屬性(即使它們是 NoneType)對 Python 中的對象列表進行排序

[英]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))

編寫一個自定義比較函數,該函數知道如何比較FakeDateTimeNone對象,然后通過指定cmp關鍵字參數告訴sort()使用此函數。

如果您有一些 None 的默認值(例如 0),您可以執行以下操作:

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

由於您尚未指定FakeDatetime的結構,我將嘗試使用內置的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM