2009-03-13 20 views
15

Sto lavorando a un programma che (tra le altre cose) legge un file CSV (viene memorizzato come una serie di dicts nel formato [{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]). Per ogni riga, come parte di un'altra elaborazione, ho bisogno di rimappare quelle chiavi ai valori inseriti dall'utente, che sono forniti in un altro dict in modo che possano essere utilizzati come parametri in una chiamata API. La matrice di mappatura è nella forma: {badname1:goodname1, badname2:goodname2,...}.Come re-mappare i tasti pyt dict

Quindi mi piacerebbe arrivare da: {badname1:data1, badname2:data2,...} per {goodname1:data1, goodname2:data2,...}

mi piacerebbe usare qualcosa come zip() (anche se i rendimenti zip(){badname1:badname1,...}).

Sembra che dovrebbe esserci una soluzione ovvia che mi sta alludendo.

EDIT: Se i dati sono in a e la mappatura in b:

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

mi avvicino, ma funzionerà solo nei casi in cui i campi sono noti per essere nello stesso ordine Credo.

risposta

20
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 in Python2.7 + con Dict Comprehensions:

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

Sì. Funziona anche senza [], come espressione di generatore. –

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

E 'questo quello che cercate?

4

Se si utilizza Python 2.7 o Python 3.x, è possibile utilizzare uno dictionary comprehension. Questa è la risposta equivalente di elo80ka (che utilizzava una comprensione delle liste), ma produce un codice leggermente più leggibile.

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()} 
    ...