如何按第二个元素但有条件对元组列表进行排序

Ant*_*ton 2 python tuples list

假设我有这个元组列表:

[(30, 'B'), (50, 'B'), (40, 'C'), (10, 'A'), (80, 'A'), (5, 'A')]
Run Code Online (Sandbox Code Playgroud)

我需要按元组的第二个元素按降序对元组进行排序,但条件是具有相同第二个元素的所有元组都彼此相邻。

所以,它应该看起来像

[(80, 'A'), (10, 'A'), (5, 'A'), (50, 'B'), (30, 'B'), (40, 'C')]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Pet*_*ood 6

您想按第二个元素排序,然后是第一个元素的负数:

>>> values = [(30, 'B'), (50, 'B'), (40, 'C'), (10, 'A'), (80, 'A'), (5, 'A')]

>>> sorted(values, key=lambda value: (value[1], -value[0]))
[(80, 'A'), (10, 'A'), (5, 'A'), (50, 'B'), (30, 'B'), (40, 'C')]
Run Code Online (Sandbox Code Playgroud)

key的参数必须sorted是一个函数,它将每个值转换为您想要比较的值。

我传入一个 lambda 函数,该函数接受值(a tuple,例如(40, 'C')),然后返回('C', -40)。然后,Python 比较第一个反转值 ,'C'如果匹配,则比较第二个值-40