如何在同一列表中具有两个不同的排序顺序?

时间:2019-01-29 16:00:26

标签: python sorting

我有一个排序列表,例如

[[1, 'start'], [13, 'start'], [13, 'end'], [15, 'end']]

my_list.sort(key=lambda x: x[0])的输出。但是,如果每个子列表的第0个元素都有联系,中间两个元素就是这种情况,那么我需要进行排序,以使带有end的列表排在最前面。因此所需的输出将是

[[1, 'start'], [13, 'end'], [13, 'start'], [15, 'end']]

2 个答案:

答案 0 :(得分:1)

您可以按另一个元素boolean进行排序,指示第二个元素是否为end

my_list.sort(key=lambda x: (x[0], x[1] != 'end'))
[[1, 'start'], [13, 'end'], [13, 'start'], [15, 'end']]

这将使用以下元组列表来对列表进行排序:

[(x[0], x[1] != 'end') for x in my_list]
[(1, True), (13, True), (13, False), (15, False)]

如果第二个元素不是False中的end,则第二个元素将为my_list。现在,鉴于第一个元素匹配,False(0)将在True (1)之前,对该数组进行排序将产生预期的结果。

sorted([(x[0], x[1] != 'end') for x in my_list])
[(1, True), (13, False), (13, True), (15, False)]

@jpp指出,在这种情况下,您可以按字典顺序简单地按第二个元素排序:

my_list.sort(key=lambda x: (x[0], x[1]))
[[1, 'start'], [13, 'end'], [13, 'start'], [15, 'end']]

答案 1 :(得分:0)

尝试

my_list.sort(key = lambda x:(x[0],x[1]))