Me gustaría ordenar las claves de list_of_dicts según list_months . Funciona bien una vez que elimino los dígitos (años) de las claves de list_of_dicts , pero no puedo entender cómo usar la expresión regular correctamente en la función lambda para incluir los dígitos.
Mi código hasta ahora:
import re list_months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] list_of_dicts = [{'Apr23': '64.401'}, {'Aug23': '56.955'}, {'Dec23': '57.453'}, {'Feb23': '90.459'}, {'Jan23': '92.731'}, {'Jul23': '56.6'}, {'Jun23': '56.509'},{'Mar23': '86.209'}, {'May23': '58.705'}, {'Nov23': '57.368'}, {'Oct23': '56.711'}, {'Sep23': '57.952'}] r = re.compile("[a-zA-Z]{3}[0-9]{2}") print(sorted(list_of_dicts, key=lambda d: [k in d for k in list_months if re.search(r, k)], reverse=True))No hay necesidad de una expresión regular aquí.
dict_months = {m:i for i, m in enumerate(list_months)} result = sorted(list_of_dicts, key=lambda d: dict_months[next(iter(d))[:3]]) print(result) # [{'Jan23': '92.731'}, {'Feb23': '90.459'}, {'Mar23': '86.209'}, {'Apr23': '64.401'}, {'May23': '58.705'}, {'Jun23': '56.509'}, {'Jul23': '56.6'}, {'Aug23': '56.955'}, {'Sep23': '57.952'}, {'Oct23': '56.711'}, {'Nov23': '57.368'}, {'Dec23': '57.453'}]Si también desea tener en cuenta el año, utilice
def sortby(d): key = next(iter(d)) return int(key[3:]), dict_months[key[:3]] result = sorted(list_of_dicts, key=sortby)Una forma de usar re.sub con list.index .
Tenga en cuenta que list.index es O(n) , que es bastante caro.
def get_key_loc(dic): k = list(dic.keys())[0] return list_months.index(re.sub("\d+", "", k)) sorted(list_of_dicts, key=get_key_loc)Producción:
[{'Jan23': '92.731'}, {'Feb23': '90.459'}, {'Mar23': '86.209'}, {'Apr23': '64.401'}, {'May23': '58.705'}, {'Jun23': '56.509'}, {'Jul23': '56.6'}, {'Aug23': '56.955'}, {'Sep23': '57.952'}, {'Oct23': '56.711'}, {'Nov23': '57.368'}, {'Dec23': '57.453'}]Realmente no necesita el dict_month , use las baterías de Python incluidas :
from datetime import datetime sorted(list_of_dicts, key=lambda x: datetime.strptime(next(iter(x)), '%b%d'))o:
import dateutil.parser sorted(list_of_dicts, key=lambda x: dateutil.parser.parse(next(iter(x))))producción:
[{'Jan23': '92.731'}, {'Feb23': '90.459'}, {'Mar23': '86.209'}, {'Apr23': '64.401'}, {'May23': '58.705'}, {'Jun23': '56.509'}, {'Jul23': '56.6'}, {'Aug23': '56.955'}, {'Sep23': '57.952'}, {'Oct23': '56.711'}, {'Nov23': '57.368'}, {'Dec23': '57.453'}]