【问题标题】:sort nested defaultdict within a list of dictionaries在字典列表中对嵌套的 defaultdict 进行排序
【发布时间】:2016-10-17 05:30:31
【问题描述】:

对于如何订购这个由嵌套的 defaultdicts 组成的列表时遇到了麻烦。我可以通过“注册”键和“类”值进行排序;

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

但是现在我尝试按嵌套默认字典的“日期”排序。我试图按时间顺序(从 - 到)按日期排序,然后最后按时间顺序排序“小时”计数器()(供参考;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 时遇到了麻烦。关于如何在排序中访问它的任何指导?

【问题讨论】:

    标签: python sorting dictionary nested defaultdict


    【解决方案1】:

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

    【讨论】:

    • 嗨 jsbueno,感谢您的回复。我尝试了上述方法,我认为获取“日期”键dates = list(item["date"].iteritems()) TypeError: list indices must be integers, not str 存在问题(我尝试使用 .items 相同的东西)。由于某种原因,它没有识别关键值并认为它是一个列表索引。关于如何获得密钥的任何想法?
    • 我玩了更多,并做了这个dates = list(item[0][1]["date"].items()),但正如你想象的那样,这只会得到第一个结果。我想我需要一个 lambda 函数来迭代 [0][1] 但我无法通过我看到的示例来解决这个问题。
    • 排序已经弄清楚了,使用for循环然后在那里排序。感谢您的帮助/指导!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2013-01-21
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多