【问题标题】:Sorting a list of tuples in different order based on the values of a tuple根据元组的值以不同的顺序对元组列表进行排序
【发布时间】:2020-06-11 04:51:27
【问题描述】:

当我们想要对一个元组列表进行排序时,其中每个元组的长度为 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)]

但是如果我想在某些情况下(不是全部)颠倒排序,例如比较第一个元素,并且如果一个元组具有 smaller 第一个元素,那么它在排序列表中更早。但如果第一个元素相同,则具有 larger 第一个元素的元组将在列表中更早。如果元组中的第二个元素相同,则具有较大第一个元素的元组将在列表中更早。

这也可以描述为:

  • 首先考虑元组中的第一个元素,按升序对它们进行排序

  • 如果元组中的第一个元素相同,则按降序对它们进行排序

  • 如果元组中的第二个元素相同,则按降序排序

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

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 的元组。如果我们有一个长度为 n 的列表,比如

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

这意味着:

  • 首先考虑元组中的第一个元素,按升序对它们进行排序

  • 如果元组中的第一个元素相同,则按降序对它们进行排序

  • 如果元组中的第二个元素相同,则按降序排序

  • 如果元组中第 n - 2 位的元素相同,则按升序排序

  • 如果元组中第 n - 1 位的元素相同,则按降序排列

我很高兴看到关于长度为 3 的元组的问题的解决方案,以及关于元组长度为 n 的广义问题的讨论。

【问题讨论】:

标签: python tuples


【解决方案1】:

您可以更改元组值中的符号以获得预期的行为:

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'... 列表映射到 key 中的每个元组 sings 和 zip,符号如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2021-07-18
    • 2021-07-25
    • 2011-05-21
    • 2018-10-24
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多