在Python中对由3个元素组成的元组列表进行排序

5

我有一组元组列表,每个元组都有三个元素。我需要对列表进行排序。如果两个元组之间存在相同的情况,则优先考虑元组的第一个元素,如果仍然相同,则考虑第二个元素。列表如下所示。

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中弄清楚它的用法。有人可以帮我吗?


sorted(L) 给出了 [(1, 14, 0), (1, 14, 2), (2, 4, 4), (4, 11, 5), (11, -1000, 6), (14, 1, 1), (14, 2, 3)]。这是期望的输出吗? - alecxe
你想要的顺序被称为字典顺序,它是序列的默认排序方式,因此您无需进行任何特殊操作。 - Bakuriu
1个回答

11

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

比较两个元组时,它们按其内容排序;首先按第一个元素排序,然后如果它们相等,则按第二个元素排序,依此类推。

演示:

>>> 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] 使用了一个反转切片

更多细节请参见Python排序指南


我不是很理解以下部分。 sorted(L, key=lambda t: t[::-1]) 您能稍微解释一下吗? - taufique
我之前尝试了不同的方法。代码片段在这里:http://paste.ubuntu.com/6013339/ 但它没有正确地工作。我哪里做错了? - taufique
你嵌套定义了两次 cmp_to_key()。外部函数没有返回任何内容,因此该函数的结果是对每个值按 None 进行排序;这将不会改变原始顺序。 - Martijn Pieters
彻底删除另一个函数。 - Martijn Pieters
哦,我的错误。我刚刚从网上复制粘贴了一些内容,并错误地将其粘贴到了一个函数中。:-P 现在它可以工作了。 - taufique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接