Python 对具有多个条件的元组排序

Python 对具有多个条件的元组排序,python,python-3.x,list,sorting,Python,Python 3.x,List,Sorting,例如,我有一个元组: 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)] sorted(m, key=lambda x: (x[0], -x[1]), reverse=True) 首先,我要: m = sorted(m,reverse=

例如,我有一个元组:

 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)]
sorted(m, key=lambda x: (x[0], -x[1]), reverse=True)
首先,我要:

m =  sorted(m,reverse=True)
=>m=[(8,2)、(8,2)、(6,2)、(5,7)、(5,3)、(5,1)、(3,7)、(3,6)]


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

这里有一种方法。这假设您希望按第一个元素(递减)和第二个元素(递增)排序

这利用了两个特性:

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

  • 请注意,由于排序是稳定的,因此可以将其分为两个步骤:

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

    这应该适合你,虽然不那么优雅

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


    您可以使用
    sorted
    函数的关键参数执行以下操作:

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

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

    我可以用函数替换lambda吗?tks
    lambda
    是一个函数!当然,是的。您可以定义一个函数
    def sorter\u func(x):…..
    ,然后只需将
    key=sorter\u func
    放入即可。