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

时间:2015-05-18 09:24:46

标签: python python-2.7 sorting

我有一个元组列表:

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

1 个答案:

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