在字典列表中对嵌套的 defaultdict 进行排序

sort nested defaultdict within a list of dictionaries

我无法理解如何对这个由嵌套的 defaultdict 组成的列表进行排序。我可以按 'registration' 键和 'classes' 值排序;

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})}})})]

但是现在我正在尝试按 'date' 进行排序,这是一个嵌套的 defaultdict。我试图按时间顺序(从 - 到)排序,然后最后按时间顺序排序 'hour' Counter() (供参考;8 = 上午 8 点,16 = 下午 4 点)。

所以上面的 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参数可以是任何可调用的。这个可调用的 return 对象可以直接与 Python 的 ==<= 运算符进行比较。作为 key 传递的对象不需要由 itemgetter 或其他一些复杂的结构调用 return。

它不需要是一个短的 - 一个表达式函数 - 也可以在 lambda 中。

因此,只需定义一个函数,让它具有所需的大小 - 以检索要比较的属性。如果有多个值,return 一个包含这些值的序列。将 key 命名参数上的此函数传递给 sort.

我不确定我是否能弄清楚你如何在你的 date 嵌套目录中订购你的 keys/values,但它可能是一些东西:

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 中进行内部排序,以使您的键也符合 "hour" 值 - 我通过将每个键都设置为每个 "date" 的排序来做到这一点list items return 一个元组,其中第一个元素是 "date" 本身用作键,第二个元素是显示在计数器中的值的排序列表(但不是每个值的计数)。

如果此辅助键太复杂而无法放入 lambda 中,只需为其创建另一个函数即可。这些函数只会为您正在排序的外部列表中的每个项目调用一次,所以您的性能应该还可以。