为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花如伊 2021-12-29 18:33:59
我想按列表键然后按日期对这个 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,但是我很难为排序键组合正确的策略。也许它只是想一次做太多事情。任何帮助或指导将不胜感激。
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

更有效的方法是构建一个将项目映射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)}]


查看完整回答
反对 回复 2021-12-29
?
翻阅古今

TA贡献1780条经验 获得超5个赞

以相反的顺序对日期进行排序有点棘手。相反,让我们使用标签索引的负数,以便它们按降序排序。然后我们可以颠倒排序,得到我们真正想要的顺序的结果!


from datetime import datetime


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

]


def descending_sort_key(item):

    return -label_order.index(item['label']), item['date']


data.sort(key=descending_sort_key, reverse=True)

瞧 - 没有约会数学或其他技巧。


查看完整回答
反对 回复 2021-12-29
  • 2 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号