我有一个元组列表:
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')]
答案 0 :(得分: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)]
或者第一个并取消反向:
print(sorted(lst,key=lambda x: -x[0])
[(3, 2), (3, 4), (1, 2), (1, 3)]
从最低到最高排序会将较低的第二个值放在第一位,但使用-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')]