例如,我有一个元组:
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) ]
但是在那之后我被困住了,我不知道下一步该做什么。如果它们重复排序升序的第二个元素,则会在元组中降序第一个元素。
答案 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个属性:
sorted
有一个key
参数,该参数接受匿名lambda
函数。请注意,由于排序是稳定的,您可以将其分为两个步骤:
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
参数,您可以指定一个函数,该函数返回元素应按其排序的值,而不是实际值。