Construyendo una lista de meses iterando entre dos fechas en una lista (Python)

Tengo una lista ordenada (es decir, ordenada) que contiene fechas ordenadas (como objetos de fecha y hora) en orden ascendente.

Quiero escribir una función que se repita en esta lista y genere otra lista de las primeras fechas disponibles para cada mes.

Por ejemplo, supongamos que mi lista ordenada contiene los siguientes datos:

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', ] 

La lista devuelta sería

 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', ] 

La lógica que propongo sería algo como esto:

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

¿Algún comentario, sugerencia? – ¿Se puede mejorar esto para que sea más ‘Pythonic’?

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

La búsqueda de listas es una operación O ( n ). Creo que simplemente puedes verificar si la clave es nueva:

 def extract_month_first_dates(input_list): output = [] last_key = None for curr_date in input_list: date_key = curr_date.date.month, curr_date.date.year # no string key required if date_key != last_key: output.append(curr_date) last_key = date_key return output 

Aquí hay una solución simple en classic python es decir, sin itertools;) y autoexplicativa

 visited = {} B = [] for a in A: month = a[:7] if month not in visited: B.append(a) visited[month] = 1 print B 

Ouput:

 ['2001/01/01', '2001/02/04', '2001/03/01', '2001/04/10', '2001/05/07', '2001/07/01', '2002/03/01', '2002/04/01']