Python - 基于多个排序项对元组列表进行排序

Can*_*ice 1 python sorting

首先,我注意到在元组排序列表上发布了很多问题,但是在查看了一些帖子后,我没有看到任何具有这种特定列表格式的问题。对于可能出现的重复问题,提前表示歉意,但我认为这应该很简单。

让元组列表如下:

my_list = [(('G', 'J', 'I'), 1.0), (('E', 'H', 'F'), 1.0), (('F', 'H', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'I', 'G'), 0.8889), (('H', 'J', 'I'), 0.875)]
Run Code Online (Sandbox Code Playgroud)

请注意,列表中的每个元组由 1:另一个长度为 3、有 3 个字母的元组和 2:一个浮点数组成。我的排序目标很简单:首先按浮点数对元组列表进行排序,第二按长度 3 元组中的第一个字母排序,打破浮点数中的任何联系,第三按按 length-3 元组中的第二个字母排序。所需的输出将是:

sorted_list = [(('E', 'H', 'F'), 1.0), (('G', 'J', 'I'), 1.0), (('F', 'H', 'G'), 0.8889),  (('H', 'I', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'J', 'I'), 0.875)]
Run Code Online (Sandbox Code Playgroud)

在这个特定的示例中,对第二个字母进行排序以打破第一个字母的联系并没有出现,尽管它在我的较大数据集中出现了。

谢谢!

Mos*_*oye 5

这是一种方法:第一种排序是在浮动上反向完成的,而通过对内部元组排序来打破联系:

srt_lst = sorted(my_list, key=lambda (x, y): (-y, x)) #python 2
print(srt_lst)
# [(('E', 'H', 'F'), 1.0), (('G', 'J', 'I'), 1.0), (('F', 'H', 'G'), 0.8889), (('H', 'I', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'J', 'I'), 0.875)]
Run Code Online (Sandbox Code Playgroud)

在 Python 3 中,您必须对 lambda 的单个参数进行索引才能访问项目并使用它们进行排序:

srt_lst = sorted(my_list, key=lambda tup: (-tup[1], tup[0]))
Run Code Online (Sandbox Code Playgroud)