以数字和月份名称排序 [英] Sorting Numericly and by Month name

查看:178
本文介绍了以数字和月份名称排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个单独的功能需要3个不同的输入:



以下格式的天数:




Day 2:某事,
第1天:某事,
第3天:某事,
第5天东西
第4天:东西



 第2周:某事,
第1周:Something,
Week 4:Something,
周3:某事,
第5周:某事

月份:

 April:Something,
February:Something,
March :东西,
一月:东西

由于他们是dicts,他们进来无序的。我正在操纵他们以有序的方式呈现给用户。



我正在寻找一种方式来分解sorted()内置来处理三类型。



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

 第1天
第2天
第3天
第4天
第5天
## #
第1周
第2周
第3周
第4周
第5周
###
一月
二月
三月
四月

我知道我可以使用三元操作:

  sorted(input_dict,key = lambda x:int如果input_dict中的第1天排序(input_dict,key = lambda x:int(x.strip(Week))如果input_dict中的第1周排序... 

但它变得相当凌乱。



寻找如何使用已定义的函数来实现关键功能。



如下所示:

  def my_so rt_function():
#magic在这里

在排序(input_dict,key = my_function)中的$:
pass
pre>

解决方案

所以...排序你的日/星期列表很容易:

  def sort_day_week_key(day_week_str):
return int(day_week_str.split()[ - 1])$ ​​b $ b
/ pre>

但是你也要处理好几个月。明显的解决方案是将月份名称映射到数字:

  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)
除了KeyError:
return sort_day_week_key

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

当然,如果您的iterable具有来自多个类别的字符串(例如,日期和月份名称)的项目,则函数将给出奇怪的结果,但是听起来不会发生...


I have a single function that takes 3 diffrent inputs:

A dict of Days in the following formart:

"Day 2":Something,
"Day 1":Something,
"Day 3":Something,
"Day 5":Something,
"Day 4":Something

A dict of weeks:

"Week 2":Something,
"Week 1":Something,
"Week 4":Something,   
"Week 3":Something,
"Week 5":Something

A dict of months:

"April":Something,
"February":Something,
"March":Something,
"January":Something

Since they are dicts, they come in unordered. I'm manipulating them to present to the user in ordered fashion.

I'm looking for a way to split the sorted() built-in to deal with the three types.

The output should be the keys sorted numercly(days/week) and by month:

"Day 1"
"Day 2"
"Day 3"
"Day 4"
"Day 5"
###
"Week 1"
"Week 2"
"Week 3"
"Week 4"
"Week 5"
###
"January"
"February"
"March"
"April"

I know I can use Ternary Operation:

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...

But it gets quite messy.

I'm looking for how to implement the key function with a already defined function.

Something like:

def my_sort_function():
    # magic goes here

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

解决方案

so ... Sorting your lists of days/weeks is pretty easy:

def sort_day_week_key(day_week_str):
    return int(day_week_str.split()[-1])

But you want to handle months as well. The obvious solution is a mapping of month names to numbers:

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

Now you just want to combine those two functions. This is pretty easy: try one, if it doesn't work use the other:

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)

Of course, this sort function will give strange results if your iterable has items from more than one class of string (e.g. days and month names) but it sounds like that won't happen...

这篇关于以数字和月份名称排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆