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
函数请注意,由于排序是稳定的,因此可以将其分为两个步骤:
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吗?tkslambda
是一个函数!当然,是的。您可以定义一个函数def sorter\u func(x):…..
,然后只需将key=sorter\u func
放入即可。