【问题标题】:Sort a tuple with many condition [duplicate]对具有许多条件的元组进行排序[重复]
【发布时间】:2018-04-10 09:21:44
【问题描述】:

例如,我有一个元组:

 m = [(5,1),(3,7),(5,7),(6,2),(8,2),(3,6),(5,3),(8,2)]

我想把这个元组排序成这样的元组:

 m_sorted = [(8, 2), (8, 2), (6, 2), (5, 1), (5, 3), (5, 7), (3, 6),
    (3, 7)]

首先我会这样做:

m =  sorted(m,reverse=True)

=> m = [(8, 2), (8, 2), (6, 2), (5, 7), (5, 3), (5, 1), (3, 7), (3, 6)]

但是在那之后我被卡住了,我不知道下一步该怎么做。如果它们重复排序升序第二个元素,则条件是对元组中的第一个元素进行降序排序。

【问题讨论】:

    标签: python python-3.x list sorting


    【解决方案1】:

    这是一种方法。这假设您要按第一个元素(递减)和第二个元素(递增)进行排序。

    m = [(5,1),(3,7),(5,7),(6,2),(8,2),(3,6),(5,3),(8,2)]
    
    res = sorted(m, key=lambda x: (-x[0], x[1]))
    
    # [(8, 2), (8, 2), (6, 2), (5, 1), (5, 3), (5, 7), (3, 6), (3, 7)]
    

    这利用了 2 个属性:

    1. sorted 有一个 key 参数,它接受一个匿名的 lambda 函数。
    2. 在 Python 中,元组和列表按元素顺序排序。

    请注意,由于排序是稳定的,您可以将其分为 2 个步骤:

    res_intermediate = sorted(m, key=lambda x: x[1])
    res = sorted(res_intermediate, key=lambda x: x[0], reverse=True)
    

    【讨论】:

    • 我可以用函数替换 lambda 吗? tks
    • lambda 是一个函数!当然,是的。您可以定义一个函数def sorter_func(x): .....,然后输入key=sorter_func
    【解决方案2】:

    这应该对你有用,虽然不是那么优雅

    x = list(reversed(sorted(m)))
    x_sorted = []
    for i in reversed(sorted(set([i[0] for i in x]))):
        y = [j[1] for j in x if j[0] == i]
        for j in sorted(y): x_sorted.append((i, j))
    print(x_sorted)
    

    [(8, 2), (8, 2), (6, 2), (5, 1), (5, 3), (5, 7), (3, 6), (3, 7 )]

    【讨论】:

      【解决方案3】:

      您可以使用sorted 函数的关键参数这样做:

      sorted(m, key=lambda x: (x[0], -x[1]), reverse=True)
      

      这是因为tuples 是按字典顺序排序的,每个元素一次从左到右。此外,通过使用key 参数,您可以指定一个函数,该函数返回元素排序依据的值,而不是它们的实际值。

      【讨论】:

        猜你喜欢
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        • 2021-02-15
        相关资源
        最近更新 更多