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