簡體   English   中英

在字典列表中對嵌套的defaultdict進行排序

[英]sort nested defaultdict within a list of dictionaries

我無法解決如何訂購由嵌套defaultdict組成的列表的麻煩。 我可以用“注冊”鍵和“類”值進行排序。

sorted(dict1.items(), key=itemgetter(1), reverse=True)

哪個產生的;

[('registration', {'count': 11, 'classes': Counter({'class1': 5, 'class2': 5, 'class3': 1}), 'date': defaultdict(<function date_record at 0x7fc173646500>, {datetime.date(2016, 6, 7): {'count': 1, 'hour': Counter({16: 1})}, datetime.date(2016, 6, 6): {'count': 10, 'hour': Counter({16: 5, 14: 2, 8: 1, 10: 1, 12: 1})}})})]

但是現在我正在嘗試按“日期”排序,這是一個嵌套的defaultdict。 我試圖按時間順序(從-到)按日期排序,然后最后按時間順序對“小時” Counter()進行排序(以供參考; 8 = 8 am,16 = 4pm)。

因此,上面的defaultdict應該看起來像這樣;

[('registration', {'count': 11, 'classes': Counter({'class1': 5, 'class2': 5, 'class3': 1}), 'date': defaultdict(<function date_record at 0x7fc173646500>, {datetime.date(2016, 6, 6): {'count': 10, 'hour': Counter({16: 5, 14: 2, 12: 1, 10: 1, 8: 1})}, datetime.date(2016, 6, 7): {'count': 1, 'hour': Counter({16: 1, 14: 4})}})})]

我只是在想出如何訪問defaultdict的麻煩。 關於如何在某種程度上訪問它的任何指導?

要排序或排序的key參數可以是任何可調用的。 這個可調用的返回對象taht可直接與Python的==<=運算符進行比較。 不需要將作為key傳遞的對象作為由itemgetter或其他復雜構造返回的可調用對象。

不需要短的-一個表達式函數-也可以在lambda中。

因此,只需定義一個函數,使其具有所需的大小-即可檢索要比較的屬性。 如果有多個值,請返回一個包含這些值的序列。 將此函數傳遞給名為參數的key進行sort

我不確定是否可以弄清楚您如何在date嵌套目錄中對鍵/值進行排序,但這可能是這樣的:

def sort_key(item):
    dates = list(item["date"].items())
    # the key in the lambda bellow will get 
    # tuples with the datetime and subdictionary for each date:

    dates.sort(key=lambda inner_date: (inner_date[0], sorted(inner_date[1]["hour"].keys())
    return dates

請注意,您需要在rder中進行內部排序,以使鍵也遵守“小時”值-我這樣做是通過使每個鍵位於每個列表項的每個“日期”的排序上來返回一個元組,其中第一個元素是本身用作鍵的“日期”,第二個是顯示在計數器中的值的排序列表(但不是每個值的計數)。

如果此輔助鍵太復雜而無法放入lambda,則只需為其創建另一個函數。 這些函數只會對您要排序的外部列表中的每個項目調用一次,因此您的性能應該還可以。

暫無
暫無

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

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