通过在列表中的两个日期之间迭代来构建月份列表(Python)

mor*_*ous 5 python

我有一个有序(即排序)列表,其中包含按升序排序的日期(作为日期时间对象).

我想编写一个迭代这个列表的函数,并生成每个月的第一个可用日期的另一个列表.

例如,假设我的排序列表包含以下数据:

A = [
'2001/01/01',
'2001/01/03',
'2001/01/05',
'2001/02/04',
'2001/02/05',
'2001/03/01',
'2001/03/02',
'2001/04/10',
'2001/04/11',
'2001/04/15',
'2001/05/07',
'2001/05/12',
'2001/07/01',
'2001/07/10',
'2002/03/01',
'2002/04/01',
]
Run Code Online (Sandbox Code Playgroud)

返回的列表将是

B = [
'2001/01/01',
'2001/02/04',
'2001/03/01',
'2001/04/10',
'2001/05/07',
'2001/07/01',
'2002/03/01',
'2002/04/01',
]
Run Code Online (Sandbox Code Playgroud)

我建议的逻辑是这样的:

def extract_month_first_dates(input_list, start_date, end_date):
    #note: start_date and end_date DEFINITELY exist in the passed in list
    prev_dates, output = [],[]  # <- is this even legal?
    for (curr_date in input_list):
        if ((curr_date < start_date) or (curr_date > end_date)):
            continue

        curr_month = curr_date.date.month
        curr_year = curr_date.date.year
        date_key = "{0}-{1}".format(curr_year, curr_month)
        if (date_key in prev_dates):
            continue
        else:
            output.append(curr_date)
            prev_dates.append(date_key)

    return output
Run Code Online (Sandbox Code Playgroud)

有什么意见,建议吗? - 这可以改进为更多'Pythonic'吗?

Sil*_*ost 7

>>> import itertools
>>> [min(j) for i, j in itertools.groupby(A, key=lambda x: x[:7])]
['2001/01/01', '2001/02/04', '2001/03/01', '2001/04/10', '2001/05/07', '2001/07/01', '2002/03/01', '2002/04/01']
Run Code Online (Sandbox Code Playgroud)

  • 太好了! - 但是,我不明白.关心什么是正在发生的,所以我们凡人都能理解;)? (2认同)