Python 按月份名称进行数字排序

Python 按月份名称进行数字排序,python,sorting,dictionary,built-in,Python,Sorting,Dictionary,Built In,我有一个函数,它接受3个不同的输入: 以下形式的天数记录: "Day 2":Something, "Day 1":Something, "Day 3":Something, "Day 5":Something, "Day 4":Something 几周的口述: "Week 2":Something, "Week 1":Something, "Week 4":Something, "Week 3":Something, "Week 5":Something 几个月的口述: "April"

我有一个函数,它接受3个不同的输入:

以下形式的天数记录:

"Day 2":Something,
"Day 1":Something,
"Day 3":Something,
"Day 5":Something,
"Day 4":Something
几周的口述:

"Week 2":Something,
"Week 1":Something,
"Week 4":Something,   
"Week 3":Something,
"Week 5":Something
几个月的口述:

"April":Something,
"February":Something,
"March":Something,
"January":Something
因为它们是密文,所以它们是无序的。我正在操纵它们以有序的方式呈现给用户

我正在寻找一种方法来拆分sorted()内置函数以处理这三种类型

输出应该是按数字(天/周)和月份排序的键:

"Day 1"
"Day 2"
"Day 3"
"Day 4"
"Day 5"
###
"Week 1"
"Week 2"
"Week 3"
"Week 4"
"Week 5"
###
"January"
"February"
"March"
"April"
我知道我可以使用三元运算:

sorted(input_dict, key=lambda x: int(x.strip("Day ")) if "Day 1" in input_dict else sorted(input_dict, key=lambda x: int(x.strip("Week ")) if "Week 1" in input_dict else sorted...
但它变得相当混乱

我正在寻找如何用一个已经定义的函数实现关键函数

比如:

def my_sort_function():
    # magic goes here

for n in sorted(input_dict, key=my_function):
    pass

所以。。。对天数/周进行排序非常简单:

def sort_day_week_key(day_week_str):
    return int(day_week_str.split()[-1])
但你也要处理好几个月。显而易见的解决方案是将月份名称映射到数字:

import calendar
_MONTH_MAP = {m.lower(): i for i, m in enumerate(calendar.month_name[1:])}
def sort_month_names_key(m_name):
    return _MONTH_MAP[m_name.lower()]
现在您只需要将这两个函数组合起来。这很简单:
试试其中一个,如果不起作用,就用另一个:

def sort_the_stuff_key(item):
    try:
        return sort_month_names_key(item)
    except KeyError:
        return sort_day_week_key

def sort_the_stuff(some_iterable):
    return sorted(some_iterable, key=sort_the_stuff_key)

当然,如果您的iterable包含来自多个字符串类(例如天和月名称)的项,则此排序函数将给出奇怪的结果,但这听起来好像不会发生…

我在这里有点困惑。。。你能给我们看一些实际的输入(3个dict)和你想要的输出吗?字符串列表不是dict。不清楚你在问什么。它引起了
ValueError:太多的值无法在
\u MONTH\u MAP={m.name.lower():i代表我,m在日历中。MONTH\u name[1:}
@f.rodrigues--当然是这样。我忘了我的
枚举
:-)太好了,没想到通过函数排序这么容易。巨蟒每天都让我惊讶。