在字典列表中对嵌套的 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 中,只需为其创建另一个函数即可。这些函数只会为您正在排序的外部列表中的每个项目调用一次,所以您的性能应该还可以。
我无法理解如何对这个由嵌套的 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 中,只需为其创建另一个函数即可。这些函数只会为您正在排序的外部列表中的每个项目调用一次,所以您的性能应该还可以。