Python-基于多个排序项的元组排序列表

Python-基于多个排序项的元组排序列表,python,sorting,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

首先,我注意到在元组的排序列表上有很多问题,但是在查看了一些帖子之后,我没有看到任何具有这种列表特殊格式的问题。事先为可能重复的问题道歉,但我认为这应该很简单

让元组列表如下所示:

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)]
请注意,列表中的每个元组由1:另一个长度为3、包含3个字母的元组和2:一个浮点数组成。因此,我的排序目标很简单:第一,按浮点数对元组列表进行排序;第二,按长度为3的元组中的第一个字母进行排序,从而断开浮点数中的任何关联;第三,按长度为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)]
在这个特定的示例中,在第二个字母上进行排序以打破第一个字母上的联系没有出现,尽管在我的更大的数据集中出现了这种情况


谢谢

这里有一种方法:第一种排序在浮点上以相反的方式进行,而关系则通过在内部元组上排序来打破:

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)]
在Python 3中,必须为lambda的单个参数编制索引,以访问项并使用它们进行排序:

srt_lst = sorted(my_list, key=lambda tup: (-tup[1], tup[0]))

那么,您想按浮点降序排序,按元组中的字母升序排序?尝试
key=lambda t:(-t[1],t[0])
注意:在
lambda中解包元组在Python 3中不起作用;否则很好。@tobias_k谢谢你的提醒。他们的python3标记丢失了anks-使用python2,并且可以确认第一个解决方案对我来说是正确排序的。FWIW,我建议只使用python3变体(它在python2.x上运行良好)。就因为python2.x变体今天可以工作,如果您决定明天将代码移植到python3,那么这只是您必须解决的另一件事。。。(不管你喜不喜欢,python3.x是python的未来)。