按月python排序元组列表

Jon*_*n C 2 python sorting

我有元组中的假期列表:

holidays = [('Easter', ('Apr', 1), 0),
            ('Earth Day', ('Apr', 22), 0),
            ('Pearl Harbor Rememberance Day', ('Dec', 7), 0),
            ('Christmas Day', ('Dec', 25), 50),
            ('Groundhog Day', ('Feb', 2), 0)]
Run Code Online (Sandbox Code Playgroud)

以及对它们进行排序的功能:

def holiday1(holidays : [(str,(str,int),int)]) -> [(str,(str,int),int)]:
    return sorted(holidays, key=lambda x:x[1])
Run Code Online (Sandbox Code Playgroud)

我按字母顺序按月分类,但我想按月份的位置对它们进行排序.(例如Jan = 1,Feb = 2等)

我已经为这几个月创建了一本字典:

months = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
Run Code Online (Sandbox Code Playgroud)

我不确定如何使用dict'months'来排序元组列表,以便结果如下:

holidays = [('Groundhog Day', ('Feb', 2), 0),
            ('Easter', ('Apr', 1), 0),
            ('Earth Day', ('Apr', 22), 0),
            ('Pearl Harbor Rememberance Day', ('Dec', 7), 0),
            ('Christmas Day', ('Dec', 25), 50)]
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 5

我们排序的元素是3元组,其中第二个元素也是元组.我们对月份感兴趣,这是元组第二个元素的第一个元素,所以我们可以用它来访问它.但是我们当然不希望按字母顺序排序,但是按照几个月的顺序,我们可以执行查找.因此,我们可以排序只服用一个月到帐户:x[1][0]months[x[1][0]]

# only taking month into account
return sorted(holidays, key=lambda x: months[x[1][0]])
Run Code Online (Sandbox Code Playgroud)

但我的猜测是,如果出现平局,你想把这一天考虑在内.关于元组的好处是,如果你比较它们,Python将首先包含两个元组的第一个元素.如果是平局,它将比较两个元组的第二个元素等.我们可以通过让key返回为2元组来使用它:首先是月份的索引,然后是日期:

# taking month and day into account
return sorted(holidays, key=lambda x: (months[x[1][0]], x[1][1]))
Run Code Online (Sandbox Code Playgroud)

编辑:如果您希望按月份和日期相同的方式按名称对假期进行排序,我们可以构建3元组:

# taking month, day and name into account
return sorted(holidays, key=lambda x: (months[x[1][0]], x[1][1], x[0]))
Run Code Online (Sandbox Code Playgroud)