【问题标题】:How to have two different sort orders within the same list? [duplicate]如何在同一个列表中有两个不同的排序顺序? [复制]
【发布时间】:2019-06-22 19:32:34
【问题描述】:

我有一个排序列表,例如

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

【问题讨论】:

标签: python sorting


【解决方案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)]

如果my_list 中的第二个元素不是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']]

【讨论】:

  • 您能解释一下 lambda 中的元组是如何工作的吗?
  • 如果你只有startend(x[0], x[1])就足够了。
  • 是的好点 @jpp 字典顺序在这里就足够了
  • @yatu 我认为您的示例有误。 [(x[0], x[1] != 'end') for x in my_list]的输出不应该是[(1, True), (13, False), (13, False), (15, False)]吗?
  • 不,你可以自己检查,它给出了提到的输出,然后用于排序
【解决方案2】:

试试这个

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

【讨论】:

  • key=lambda x: (x[0], x[1]) 是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多