Python 用年份注释月份列表

Python 用年份注释月份列表,python,calendar,Python,Calendar,我有一个连续几个月的列表,总是包括当前月份。例如,在我写这篇文章时,时间是2020年4月,因此有效列表可以是以下任意一项: example1 = ["January", "February", "March", "April", "May"] example2 = ["December", "January", "February", "March", "April"] example3 = ["April", "May", "June", "July", "August", "Septembe

我有一个连续几个月的列表,总是包括当前月份。例如,在我写这篇文章时,时间是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…
    结构遍历列表的其余部分,根据当前月份的哪一侧生成值
我使用了dateutil.relativedelta中的
导入relativedelta
,正如之前的文章所说的那样

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




所有这些都是在假设当前月份(例如4月)在您的列表中只发生一次的情况下完成的(根据您的解释)。即使如此,只要我们能够安全地假设4月的第一个指数是你的起始位置,它仍然有效


希望有帮助。

先把月份作为一个数字,然后你就可以在列表上进行排序了。目标之前的所有月份将在当前或上一年,而目标之后的月份将在当前或下一年

name\u to\u num
函数来自

从日期时间导入日期时间
导入日历
name_to_num={name:num代表num,如果num},则在枚举(calendar.month_name)中命名
def f(月):
curr_month=datetime.now().strftime(“%B”)#获取月份名称。
curr_year=datetime.now().year
curr\u month\u idx=name\u to\u num[curr\u month]
年份=[]
所见当前月=假
月份中的月份:
month_idx=name_to_num[月份]
#一旦到达terget月,设置为True。
如果月份=当前月份:
见当前月=真
#目标尚未被发现
如果未在当前月份看到:
#但这几个月比去年的目标更糟糕。
如果月份ID>当前月份ID:
年份。附加(当前年份-1)
#如果它们小于或等于目标,则为本年度。
其他:
年份。附加(当前年份)
#从现在起的所有年份都将大于或等于当前年份。
其他:
#如果月份大于当前月份,则为同一年。
如果月份\u idx>=当前月份\u idx:
年份。附加(当前年份)
#否则就要到明年了。
其他:
年份。追加(当前年份+1)
回归年
示例1=[“一月”、“二月”、“三月”、“四月”、“五月”]
例2=[“十二月”、“一月”、“二月”、“三月”、“四月”]
例3=[“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”、“一月”、“二月”]
打印(f(示例1))#[2020、2020、2020、2020、2020]
打印(f(示例2))#[2019、2020、2020、2020、2020]
打印(f(示例3)35;[2020、2020、2020、2020、2020、2020、2020、2020、2020、2020、2021、2021]

是否有两个四月?是的,如果有两个四月怎么办,如果输入不正确怎么办(例如跳过一个月)?你从哪里得到这些信息的?假设当月只有一个实例,另一种解决方案可能是解决问题的更稳健的方法。例如,两个四月或混乱的输入超出范围。您是否始终知道当前月份的索引?与当前月份在列表中的位置相同。如果两个april在不同的年份存在,但我们不知道哪一个是当前的april,冲突就会发生。
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]