在python中使用3个元素对元组列表进行排序

时间:2013-08-22 07:50:59

标签: python list sorting tuples

我有一些元组列表。每个元组都有三个元素。我需要对列表进行排序。为了打破两个元组之间的联系,首先查看元组的第一个元素然后再绑定第二个元素。列表如下所示。

L = [(1, 14, 0), (14, 1, 1), (1, 14, 2), (14, 2, 3), (2, 4, 4), (4, 11, 5), (11, -1000, 6)]

在C中,sort函数采用比较函数,并且只执行所有操作。但有时在python尝试后我无法弄明白。有人能帮助我吗?

1 个答案:

答案 0 :(得分:9)

只需对列表进行排序;默认排序正是您想要的。

比较两个元组时,根据其内容对它们进行排序;先在第一个元素上排序,然后如果它们相等,则在第二个元素上排序等等。

演示:

>>> L = [(14, 2, 3), (1, 14, 0), (14, 1, 1), (1, 14, 2), (2, 4, 4), (4, 11, 5), (11, -1000, 6)]
>>> sorted(L)
[(1, 14, 0), (1, 14, 2), (2, 4, 4), (4, 11, 5), (11, -1000, 6), (14, 1, 1), (14, 2, 3)]

我向前移动了(14, 2, 3)元素,表明它仍然在(14, 1, 1)之后排序。

Python的list.sort()方法和sorted()函数使用key函数返回一个值,如果您需要不同的排序顺序,则可以对其进行排序。如果你想先对最后一个元素进行排序,然后再对最后一个元素进行排序,等等,你可以使用:

sorted(L, key=lambda t: t[::-1])

其中lambda返回一个反向元组以进行排序。传递给key的可调用对象被调用输入序列中的每个元素,以便在排序之前“扩充”列表,就像您已经完成的那样:

[s[1] for s in sorted((key(s), s) for s in L)]

t[::-1]使用reversing slice

有关详细信息,请参阅Python Sorting HOWTO