Tengo dos listas:
list1 = [{"name":"xyz" ,"roll":"r" , "sap_id":"z"} , {"name":"pqr" ,"roll":"s" , "sap_id":"w"}] list2 = [{"cn_number":"26455"} , {"cn_number":"26456"}]Quiero una nueva lista como:
new_list = [{"name":xyz ,"roll":"r" , "sap_id":"z","cn_number":"26455"} , {"name":"pqr" ,"roll":"s" , "sap_id":"w","cn_number":"26456"}]Probé el siguiente método:
new_list = [i.update(j) for i, j in zip(list1, list2)]pero obtuve un error desagradable
Esta sintaxis funciona para python3.5+ para fusionar dos diccionarios z = {**x, **y}
Python 3.7.0 (default, Jun 28 2018, 13:15:42) >>> list1 = [{"name":"xyz" ,"roll":"r" , "sap_id":"z"} , {"name":"pqr" ,"roll":"s" , "sap_id":"w"}] >>> list2 = [{"cn_number":"26455"} , {"cn_number":"26456"}] >>> new_list = [{**i, **j} for i, j in zip(list1, list2)] >>> new_list [{'name': 'xyz', 'roll': 'r', 'sap_id': 'z', 'cn_number': '26455'}, {'name': 'pqr', 'roll': 's', 'sap_id': 'w', 'cn_number': '26456'}]Más información: ¿Cómo fusiono dos diccionarios en una sola expresión (tomar unión de diccionarios)?
Puede usar la sintaxis de combinación de dictados de Python 3.5+ :
new_list = [{**a, **b} for (a, b) in zip(list1, list2)]da como resultado
[ {'name': 'xyz', 'roll': 'r', 'sap_id': 'z', 'cn_number': '26455'}, {'name': 'pqr', 'roll': 's', 'sap_id': 'w', 'cn_number': '26456'}, ]Una forma eficiente de hacer esto es con collections.ChainMap que está hecho específicamente para combinar varios diccionarios. Lea más sobre la documentación aquí .
from collections import ChainMap [dict(ChainMap(i,j)) for i,j in zip(list1, list2)] [{'cn_number': '26455', 'name': 'xyz', 'roll': 'r', 'sap_id': 'z'}, {'cn_number': '26456', 'name': 'pqr', 'roll': 's', 'sap_id': 'w'}]NOTA: Dependiendo de cómo desee usar cada elemento de la lista actualizada, puede usar un generador y evitar usar
dict()sobre el objetoChainMappara obtener lo que necesita sin usar memoria innecesaria.ChainMaple brinda una vista única y actualizable de los múltiples diccionarios al seguir haciendo referencia a los objetos originales.
#efficient way - #EDITED: lesser keystrokes as suggested by @Kelly g = map(ChainMap, list1, list2) #g = (ChainMap(i,j) for i,j in zip(list1, list2)) next(g).get('sap_id') z