对具有许多条件的元组进行排序

doo*_*men 2 python sorting list python-3.x

例如,我有一个元组:

 m = [(5,1),(3,7),(5,7),(6,2),(8,2),(3,6),(5,3),(8,2)]
Run Code Online (Sandbox Code Playgroud)

我想将这个元组排序为这样的元组:

 m_sorted = [(8, 2), (8, 2), (6, 2), (5, 1), (5, 3), (5, 7), (3, 6),
    (3, 7)]
Run Code Online (Sandbox Code Playgroud)

我先做:

m =  sorted(m,reverse=True)
Run Code Online (Sandbox Code Playgroud)

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

但在那之后我被卡住了,我不知道接下来要做什么.如果他们复制升序的第二个元素,条件是元组中的第一个元素降序.

jpp*_*jpp 5

这是一种方式.这假设您要按第一个元素(递减)和第二个元素(递增)排序.

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)]
Run Code Online (Sandbox Code Playgroud)

这利用了2个属性:

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

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

res_intermediate = sorted(m, key=lambda x: x[1])
res = sorted(res_intermediate, key=lambda x: x[0], reverse=True)
Run Code Online (Sandbox Code Playgroud)