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

Python 如何在同一个列表中有两个不同的排序顺序?,python,sorting,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']] 您可以通过另一个元素进行排序,一个布尔值

我有一个排序列表,如

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

您可以通过另一个元素进行排序,一个
布尔值
,指示第二个元素是否为
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)]
其中,如果第二个元素不是
myu列表中的
end
,则该元素将为
False
。现在,对该数组进行排序将产生预期结果,因为当第一个元素匹配时,
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()
[[1, 'start'], [13, 'end'], [13, 'start'], [15, 'end']]
试试这个

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

你能解释一下lambda中的元组是如何工作的吗?如果你只有
start
end
(x[0],x[1])
就足够了。是的,good point@jpp字典顺序就足够了here@yatu我认为你的例子有错误。我的列表中x的
[(x[0],x[1]!='end')
的输出不应该是
[(1,True),(13,False),(13,False),(15,False)]
?不,你可以自己检查,它给出了所提到的输出,然后用于排序
排序(我的列表)
在这里就足够了(你自己试试)。它之所以有效,是因为
end
按字母顺序在
start
之前。
key=lambda x:(x[0],x[1])
是冗余的。