【问题标题】:Sorting a list of tuples with 3 elements in python在python中对具有3个元素的元组列表进行排序
【发布时间】:2013-08-24 20:06:31
【问题描述】:

我有一些元组的列表。每个元组包含三个元素。我需要对列表进行排序。为了打破两个元组之间的关系,首先查找元组的第一个元素,如果仍然绑定,则查找第二个元素。列表如下。

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

在 C 语言中,排序函数采用比较函数,这一切都很简单。但有时在python 中尝试后我无法弄清楚。有人可以帮帮我吗?

【问题讨论】:

  • sorted(L) 给了我[(1, 14, 0), (1, 14, 2), (2, 4, 4), (4, 11, 5), (11, -1000, 6), (14, 1, 1), (14, 2, 3)]。它是理想的输出吗?
  • 你想要的顺序叫做字典序,它是序列的默认顺序,所以你不需要做任何特殊的事情。

标签: python list sorting tuples


【解决方案1】:

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

比较两个元组时,按照内容排序;先按第一个元素排序,如果相等,则按第二个元素排序,以此类推。

演示:

>>> 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

【讨论】:

  • 以下部分我听不懂。 sorted(L, key=lambda t: t[::-1]) 你能解释一下吗?
  • 我之前尝试过不同的方式。代码片段在这里:paste.ubuntu.com/6013339 但它无法正常工作。我哪里做错了?
  • 您定义了两次cmp_to_key(),嵌套。外部函数不返回任何内容,因此该函数的结果是您按None 对每个值进行排序;不影响原始订单。
  • 完全删除其他功能。
  • 哦,我的错。我只是从网上复制和粘贴,然后错误地将其粘贴到函数中。 :-P 现在正在运行。
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 2021-08-06
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多