Tengo una lista de diccionarios que es la siguiente:
VehicleList = [ { 'id': '1', 'VehicleType': 'Car', 'CreationDate': datetime.datetime(2021, 12, 10, 16, 9, 44, 872000) }, { 'id': '2', 'VehicleType': 'Bike', 'CreationDate': datetime.datetime(2021, 12, 15, 11, 8, 21, 612000) }, { 'id': '3', 'VehicleType': 'Truck', 'CreationDate': datetime.datetime(2021, 9, 13, 10, 1, 50, 350095) }, { 'id': '4', 'VehicleType': 'Bike', 'CreationDate': datetime.datetime(2021, 12, 10, 21, 1, 00, 300012) }, { 'id': '5', 'VehicleType': 'Car', 'CreationDate': datetime.datetime(2021, 12, 21, 10, 1, 50, 600095) } ]¿Cómo puedo obtener una lista de los vehículos más recientes para cada 'Tipo de vehículo' según su 'Fecha de creación'?
Espero algo como esto-
latestVehicles = [ { 'id': '5', 'VehicleType': 'Car', 'CreationDate': datetime.datetime(2021, 12, 21, 10, 1, 50, 600095) }, { 'id': '2', 'VehicleType': 'Bike', 'CreationDate': datetime.datetime(2021, 12, 15, 11, 8, 21, 612000) }, { 'id': '3', 'VehicleType': 'Truck', 'CreationDate': datetime.datetime(2021, 9, 13, 10, 1, 50, 350095) } ]Intenté separar cada diccionario según su 'Tipo de vehículo' en diferentes listas y luego elegir el último.
Creo que podría haber una forma más óptima de hacer esto.
Use un mapeo de diccionario desde el valor de VehicleType hasta el diccionario que desea en su lista final. Compare la fecha de cada elemento en la lista de entrada con la de su dictamen y conserve la última.
latest_dict = {} for vehicle in VehicleList: t = vehicle['VehicleType'] if t not in latest_dict or vehicle['CreationDate'] > latest_dict[t]['CreationDate']: latest_dict[t] = vehicle latestVehicles = list(latest_dict.values())Aquí hay una solución usando max y filter :
VehicleLatest = [ max( filter(lambda _: _["VehicleType"] == t, VehicleList), key=lambda _: _["CreationDate"] ) for t in {_["VehicleType"] for _ in VehicleList} ]Resultado
print(VehicleLatest) # [{'id': '2', 'VehicleType': 'Bike', 'CreationDate': datetime.datetime(2021, 12, 15, 11, 8, 21, 612000)}, {'id': '3', 'VehicleType': 'Truck', 'CreationDate': datetime.datetime(2021, 9, 13, 10, 1, 50, 350095)}, {'id': '5', 'VehicleType': 'Car', 'CreationDate': datetime.datetime(2021, 12, 21, 10, 1, 50, 600095)}]Creo que puedes lograr lo que quieres usando la función groupby de itertools.
from itertools import groupby # entries sorted according to the key we wish to groupby: 'VehicleType' VehicleList = sorted(VehicleList, key=lambda x: x["VehicleType"]) latestVehicles = [] # Then the elements are grouped. for k, v in groupby(VehicleList, lambda x: x["VehicleType"]): # We then append to latestVehicles the 0th entry of the # grouped elements after sorting according to the 'CreationDate' latestVehicles.append(sorted(list(v), key=lambda x: x["CreationDate"], reverse=True)[0])