猿问

按多个键排序字典列表,包括列表

我想按列表键然后按日期对这个 dicts 列表进行排序。我正在尝试根据 label_order 按 'label' 对 dicts 进行排序,然后按降序对 'date' 进行排序。


label_order = [3, 4, 2, 1]


data = [

    {'label': 1, 'data': 5, 'date': datetime(2018, 12, 31)},

    {'label': 3, 'data': 2, 'date': datetime(2017, 12, 31)},

    {'label': 3, 'data': 1, 'date': datetime(2018, 12, 31)},

    {'label': 4, 'data': 3, 'date': datetime(2018, 12, 31)},

    {'label': 4, 'data': 4, 'date': datetime(2018, 12, 25)},

]

排序后看起来像这样:


data = [

    {'label': 3, 'data': 1, 'date': datetime(2018, 12, 31)},

    {'label': 3, 'data': 2, 'date': datetime(2017, 12, 31)},

    {'label': 4, 'data': 3, 'date': datetime(2018, 12, 31)},

    {'label': 4, 'data': 4, 'date': datetime(2018, 12, 25)},

    {'label': 1, 'data': 5, 'date': datetime(2018, 12, 31)},

]

我已经尝试过 lambda 表达式和 itemgetter,但是我很难为排序键组合正确的策略。也许它只是想一次做太多事情。


任何帮助或指导将不胜感激。


繁花如伊
浏览 240回答 2
2回答

函数式编程

更有效的方法是构建一个将项目映射label_order到索引的字典,以便在执行排序时可以使用索引作为键:keys = {n: i for i, n in enumerate(label_order)}sorted(data, key=lambda d: (-keys[d['label']], d['date']), reverse=True)这将返回:[{'label': 3, 'data': 1, 'date': datetime(2018, 12, 31)}, {'label': 3, 'data': 2, 'date': datetime(2017, 12, 31)}, {'label': 4, 'data': 3, 'date': datetime(2018, 12, 31)}, {'label': 4, 'data': 4, 'date': datetime(2018, 12, 25)}, {'label': 1, 'data': 5, 'date': datetime(2018, 12, 31)}]

翻阅古今

以相反的顺序对日期进行排序有点棘手。相反,让我们使用标签索引的负数,以便它们按降序排序。然后我们可以颠倒排序,得到我们真正想要的顺序的结果!from datetime import datetimelabel_order = [3, 4, 2, 1]data = [    {'label': 1, 'data': 5, 'date': datetime(2018, 12, 31)},    {'label': 3, 'data': 2, 'date': datetime(2017, 12, 31)},    {'label': 3, 'data': 1, 'date': datetime(2018, 12, 31)},    {'label': 4, 'data': 3, 'date': datetime(2018, 12, 31)},    {'label': 4, 'data': 4, 'date': datetime(2018, 12, 25)},]def descending_sort_key(item):    return -label_order.index(item['label']), item['date']data.sort(key=descending_sort_key, reverse=True)瞧 - 没有约会数学或其他技巧。
随时随地看视频慕课网APP

相关分类

Python
我要回答