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

时间:2016-06-15 22:09:06

标签: python sorting dictionary nested 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})}})})]

然而,现在我正试图按日期排序&#39;这是一个嵌套的defaultdict。我试图按时间顺序(从 - 到)按顺序排序,然后最后订购&#39;小时&#39;计数器()按时间顺序排列(供参考; 8 = 8am,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。关于如何在排序中访问它的任何指导?

1 个答案:

答案 0 :(得分:0)

要排序或排序的key参数可以是任何可调用的。这个callable应该返回对象,它可以直接与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,只需为其创建另一个函数即可。这些函数只会为您要排序的外部列表中的每个项目调用一次,因此您的性能仍然可以正常。