python - 用年份注释月份列表

标签 python calendar

我有一个连续几个月的列表,始终包括当月。例如,当我写这篇文章时,时间是 2020 年 4 月,因此有效列表可以是以下任意列表:

example1 = ["January", "February", "March", "April", "May"]
example2 = ["December", "January", "February", "March", "April"]
example3 = ["April", "May", "June", "July", "August", "September", "October", "November", "December", "January", "February"]

编写 Python 函数的最佳方法是什么,给定一个这样的列表,该函数将返回相应的年份列表,以当前月份为当前年份。例如:

f(example1) = [2020, 2020, 2020, 2020, 2020]
f(example2) = [2019, 2020, 2020, 2020, 2020]
f(example3) = [2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2021, 2021]

我能想到的最好的方法是按当前月份对原始列表进行分区,然后在每个方向上循环,同时还跟踪年份,然后将两个结果列表放在一起。但这太多循环了。有更优雅/更快的解决方案吗?

最佳答案

作为一名 Python 初学者,我一直有些困惑。我认为逻辑是:

  • 查找您当前工作月份的索引,例如:四月
  • 将其设置为当前年份
  • 使用 if...elif... 结构循环遍历列表的其余部分,根据当前月份的哪一侧生成值。

我按照this使用了from dateutil.relativedelta importrelativedelta关于 SO 的旧帖子。

import datetime as dt
from dateutil.relativedelta import relativedelta

def get_years_for(months):
    today = dt.date.today()
    try:
        month_index = months.index(today.strftime("%B"))
    except ValueError:
        return []

    current_month = today.month
    current_year = today.year
    day1 = dt.date(current_year, current_month, 1)

    years = {month_index: current_year}

    for idx, month in enumerate(months):
        if idx < month_index:
            years[idx] = (day1 - relativedelta(months=month_index - idx)).year
        elif idx > month_index:
            years[idx] = (day1 + relativedelta(months=idx - month_index)).year

    return [years[i] for i in sorted(years)]

我确信这可以做得更简洁,但我喜欢这个挑战,因为我是新手 =)

<小时/>
example1 = ["January", "February", "March", "April", "May"]
[2020, 2020, 2020, 2020, 2020]
<小时/>
example2 = ["December", "January", "February", "March", "April"]
[2019, 2020, 2020, 2020, 2020]
<小时/>
example3 = ["April", "May", "June", "July", "August", "September", "October", "November", "December", "January", "February"]
[2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2021, 2021]
<小时/>
example4 = ["November", "December", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "January", "February"]
[2019, 2019, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2021, 2021]
<小时/>

所有这些都是在当前月份的假设下完成的,例如四月,仅在您的列表中出现一次(根据您的解释)。即便如此,只要我们可以安全地假设四月的第一个指数是您的起始位置,它仍然有效。

希望有帮助。

关于python - 用年份注释月份列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60987700/

相关文章:

java - TimeZone 和 Locale 是否只需要调用一次 setDefault() ?

java - 日历给出了第 1 年的意外结果

python - 如何将所有变量从父类继承到具有 init 函数的基类?

使用traceback.print_exc()打印AttributeError的回溯时出现Python TypeError

javascript - ng-change 不适用于我的半自定义日历控件

android - 为什么保存日期的当前年份为3912?

android - java.lang.IllegalArgumentException : Bad class: class java. util.GregorianCalendar

python - 合并几个 Python 字典

python - 包装一个类,其方法返回该类的实例

python - 在 python 中设置隐式默认编码\解码错误处理