基于两个键排序,降序排序为第一个,升序排序为第二个

Pra*_*ord 2 python sorting python-2.7

我有一个元组列表:

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

Pad*_*ham 6

否定第二个关键:

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)]
Run Code Online (Sandbox Code Playgroud)

或者第一个并删除相反的:

print(sorted(lst,key=lambda x: -x[0])

[(3, 2), (3, 4), (1, 2), (1, 3)]
Run Code Online (Sandbox Code Playgroud)

从最低到最高排序将使较低的第二个值首先使用,但是使用-x[0]将首先放置较高的第一个元素.

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

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')] 
Run Code Online (Sandbox Code Playgroud)