values multiple keys item dictionaries python dictionary

keys - python dictionary multiple values



¿Cómo puedo volver a mapear las claves de dictado de Python? (3)

Estoy trabajando en un programa que (entre otras cosas) lee un archivo CSV (se almacena como una matriz de dicts en la forma [{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}] ). Para cada fila, como parte de otro procesamiento, necesito volver a asignar esas claves a los valores ingresados ​​por el usuario, que se proporcionan en otro dictado para que puedan usarse como parámetros en una llamada de API. La matriz de asignación está en la forma: {badname1:goodname1, badname2:goodname2,...} .

Así que me gustaría pasar de: {badname1:data1, badname2:data2,...} a {goodname1:data1, goodname2:data2,...}

Me gustaría usar algo como zip() (aunque zip() produce {badname1:badname1,...} ).

Parece que debería haber una solución obvia que me alude.

EDITAR: Si los datos están en a y la asignación en b :

dict(zip(b,a.itervalues()))

Me acerco, pero solo funcionará en los casos en que se sabe que los campos están en el mismo orden que creo.


Si está utilizando Python 2.7 o Python 3.x, puede usar un diccionario de comprensión . Esta es una respuesta equivalente de elo80ka (que usó una lista de comprensión), pero produce un código un poco más legible.

name_map = {''oldcol1'': ''newcol1'', ''oldcol2'': ''newcol2'', ''oldcol3'': ''newcol3''...} for row in rows: # Each row is a dict of the form: {''oldcol1'': ''...'', ''oldcol2'': ''...''} row = {name_map[name]: val for name, val in row.iteritems()} ...


name_map = {''oldcol1'': ''newcol1'', ''oldcol2'': ''newcol2'', ''oldcol3'': ''newcol3''...} for row in rows: # Each row is a dict of the form: {''oldcol1'': ''...'', ''oldcol2'': ''...''} row = dict((name_map[name], val) for name, val in row.iteritems()) ...

O en Python2.7 + con Comprensiones de Dict :

for row in rows: row = {name_map[name]: val for name, val in row.items()}


rows = [{"col1":"data1a","col2":"data2a"},{"col1":"data1b","col2":"data2b"}] name_map = {"col1":"newcol1","col2":"newcol2"} new_rows = [dict(zip(map(lambda x: name_map[x], r.keys()), r.values())) for r in rows]

¿Es esto lo que buscas?