【问题标题】:Sorting Numericly and by Month name按数字和月份名称排序
【发布时间】:2023-04-03 08:50:02
【问题描述】:

我有一个接受 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

因为它们是 dicts,所以它们是无序的。我正在操纵它们以有序的方式呈现给用户。

我正在寻找一种方法来拆分内置的 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

【问题讨论】:

  • 我在这里有点困惑......你能告诉我们一些实际的输入(3 个字典)和你正在寻找的输出吗?
  • 字符串列表不是字典。不清楚你在问什么。

标签: python sorting dictionary built-in


【解决方案1】:

所以...对您的天/周列表进行排序非常容易:

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()]

现在您只想结合这两个功能。这很简单:try 一个,如果它不起作用,请使用另一个:

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)

当然,如果您的可迭代对象包含来自不止一类字符串的项目(例如日期和月份名称),则此排序函数会给出奇怪的结果,但听起来不会发生......

【讨论】:

  • 它正在提高ValueError: too many values to unpack _MONTH_MAP = {m.name.lower(): i for i, m in calendar.month_name[1:]}
  • @f.rodrigues -- 当然是。我忘了我的enumerate :-)
  • 太棒了,没想到通过函数排序这么容易。 Python 每天都让我感到惊奇。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多