根据元组的值,以不同的顺序对元组列表进行排序。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据元组的值,以不同的顺序对元组列表进行排序。相关的知识,希望对你有一定的参考价值。

当我们想对一个元组列表进行排序,其中每个元组的长度都是3(都是递增的),我们用下面的代码对其进行右键排序。

ts = [(7, 14, 5), (3, 12, 9), (20, 22, 8), (20, 23, 24), (3, 12, 8), (4, 5, 7), (4, 5, 6), (4, 22, 17)]
ts.sort(key=lambda t: (t[0], t[1], t[2]))

我的意思是,最初比较零位置的元素,元组中的零元素越低,越接近开头。如果两个元组在零点位置上的数值相同,那么第二元素较低的元素将更接近左边。如果两个元组的第二个元素相同,则考虑元组中的第三个元素。

所以上述代码的输出是

Output: [(3, 12, 8), (3, 12, 9), (4, 5, 6), (4, 5, 7), (4, 22, 17), (7, 14, 5), (20, 22, 8), (20, 23, 24)]

但是,如果我想在某些情况下(不是所有情况)颠倒排序,例如比较第一个元素,如果一个元组有 较小 的第一个元素,它在排序列表中更早。但如果第一个元素相同,元组与 更大 的第一个元素会在列表中更早。而如果一个元组中的第二个元素是相同的,则元组与 更大 第一个元素在列表中的位置会更早。

这也可以描述为。

  • 首先考虑元组中的第一个元素 按递增的顺序进行排序

  • 如果一个元组中的第一个元素相同,则按递减顺序排序

  • 如果一个元组中的第二个元素相同,则按递减顺序排序

所以,我提供的输入应该是

Output: [(3, 12, 9), (3, 12, 8), (4, 22, 17), (4, 5, 7), (4, 5, 6), (7, 14, 5), (20, 23, 24), (20, 22, 8)]

我想知道,这是否可以使用lambda函数来完成,还是必须有一个单独的方法来实现所需的排序。

我们也可以将这个问题泛化到长度为n的元组上。

('increasing', 'decreasing', 'decreasing', ..., 'increasing', 'decreasing')

这就意味着。

  • 首先考虑元组中的第一个元素 按递增顺序排序

  • 如果一个元组中的第一个元素相同,则按递减顺序排序

  • 如果一个元组中的第二个元素相同,则按递减顺序排序

  • 如果一个元组中n-2位置的元素相同,则按递增顺序排序

  • 如果元组中位置n - 1的元素相同,则按递减顺序排序。

我很乐意看到关于长度为3的元组问题的解决方法,以及对长度为n的元组的一般性问题的讨论。

答案

你可以改变元组值中的符号来获得预期的行为。

ts.sort(key=lambda t: (t[0], -t[1], -t[2]))

print(ts)
# [(3, 12, 9), (3, 12, 8), (4, 22, 17), (4, 5, 7), (4, 5, 6), (7, 14, 5), 
#  (20, 23, 24), (20, 22, 8)]

在一般情况下,你可以将这些符号映射到... increasing', 'decreasing'... 榜上有名,以唱和 zip 中的每个元组 key 与标志为。

l = ('increasing', 'decreasing', 'decreasing')
d = 'increasing':1, 'decreasing':-1
signs = [d[i] for i in l]
ts.sort(key = lambda x: tuple(i*sign for sign,i in zip(signs, x)))

这将产生与上述相同的结果。

print(ts)
# [(3, 12, 9), (3, 12, 8), (4, 22, 17), (4, 5, 7), (4, 5, 6), (7, 14, 5), 
#  (20, 23, 24), (20, 22, 8)]

以上是关于根据元组的值,以不同的顺序对元组列表进行排序。的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个列表中元组元素的顺序对元组列表进行排序?

如何根据另一个列表对元组列表进行排序

根据第三个参数对元组列表进行排序[重复]

按元组的第二个元素对元组列表进行排序,无需高阶函数或递归

如何按两个元素对元组列表进行排序?

如何根据某些文本标准对元组列表进行分组/存储?