【问题标题】:sorted on basis of two keys, descending order sort for first and ascending for second根据两个键排序,第一个降序排序,第二个升序排序
【发布时间】:2015-05-18 19:34:46
【问题描述】:

我有一个元组列表:

lst = [(1,2), (3,2), (1,3), (3,4)]

我想根据第一个键按降序对这个列表进行排序,但是对于 这个键的相同值,列表应该根据第二个键排序,但是升序

但如果我这样做:

srt_lst = sorted(lst, key=lambda val: (val[0], val[1]), reverse = True)

它给了我:

[(3, 4), (3, 2), (1, 3), (1, 2)]

但我正在寻找的列表是

[(3, 2), (3, 4), (1, 2), (1, 3)]

编辑

抱歉,我已经提供了所有需要的信息!!!!

请考虑,以下作为我的列表:

[('1', '3:00 PM'), ('1', '3:00AM'), ('2', '1:00 AM'), ('2', '2:00 AM')]

srt_lst = sorted(lst, key=lambda val: (val[0], val[1]), reverse = True)

提供: [(2, '2:00 PM'), (2, '2:00 AM'), (2, '1:00 AM'), (1, '3:00 PM'), (1, '3:00 AM')]

要求是:

[(2, '2:00 AM'), (2, '2:00 PM'), (1, '3:00 AM'), (1, '3:00 PM')]

【问题讨论】:

    标签: python python-2.7 sorting


    【解决方案1】:

    否定第二个键:

    lst = [(1,2), (3,2), (1,3), (3,4)]
    
    print(sorted(lst,key=lambda x: (x[0],- x[1]),reverse=True))
    [(3, 2), (3, 4), (1, 2), (1, 3)]
    

    或第一个并删除相反的:

    print(sorted(lst,key=lambda x: -x[0])
    
    [(3, 2), (3, 4), (1, 2), (1, 3)]
    

    从最低到最高排序会将较低的第二个值放在首位,但使用-x[0] 会将较高的第一个元素放在首位。

    根据您的编辑,您需要将 x[0] 转换为 int 并将时间解析为日期时间对象:

    from datetime import datetime
    
    lst = [('1', '3:00 PM'), ('1', '3:00 AM'), ('2', '1:00 AM'), ('2', '2:00 AM')]
    
    print(sorted(lst,key=lambda x: (-int(x[0]), datetime.strptime(x[1], "%H:%M %p"))))
    [('2', '1:00 AM'), ('2', '2:00 AM'), ('1', '3:00 PM'), ('1', '3:00 AM')] 
    

    【讨论】:

    • 我的道歉,我说,我提供的细节是 enuf,但第二个字段恰好是时间字符串。请将[('1', '3:00 PM'), ('1', '3:00AM'), ('2', '1:00 AM'), ('2', '2:00 AM')] 视为我的列表。也更新问题
    • 没有问题,我认为'3:00AM' 是一个错字,您必须始终将数字排序为实际的整数/浮点数.. 与处理字符串时"1000" > "2" 的时间相同
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 2021-09-29
    • 2020-11-19
    • 2017-10-16
    • 1970-01-01
    • 2019-05-24
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多