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

时间:2018-04-10 09:21:44

标签: 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)]

首先我做:

m =  sorted(m,reverse=True)

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

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

3 个答案:

答案 0 :(得分: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)]

这利用了2个属性:

  1. sorted有一个key参数,该参数接受匿名lambda函数。
  2. 在Python中,元组和列表按元素顺序排序。
  3. 请注意,由于排序是稳定的,您可以将其分为两个步骤:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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