2009-03-13 4 views
15

Je travaille sur un programme qui (entre autres) lit un fichier CSV dans (il est stocké comme un tableau de dicts sous forme [{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]). Pour chaque ligne, dans le cadre d'un autre traitement, je dois redéfinir les clés de valeurs entrées utilisateur, qui sont fournis dans un autre dict afin qu'ils puissent être utilisés comme paramètres dans un appel API. Le tableau de mappage est au format suivant: {badname1:goodname1, badname2:goodname2,...}.Comment puis-je Réajuster les clés dict python

Je voudrais recevoir: {badname1:data1, badname2:data2,...} à {goodname1:data1, goodname2:data2,...}

Je voudrais utiliser quelque chose comme zip() (bien que les rendements zip(){badname1:badname1,...}).

On dirait qu'il devrait y avoir une solution évidente qui me fait allusion.

EDIT: Si les données sont dans a et la mise en correspondance dans b:

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

Je reçois près, mais il ne fonctionnera que dans les cas où les champs sont connus pour être dans le même ordre Je pense.

Répondre

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

Ou en python2.7 + avec Dict Comprehensions:

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

Yep. Fonctionne également sans le [], en tant qu'expression de générateur. –

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] 

Est-ce que vous êtes après?

4

Si vous utilisez Python 2.7 ou 3.x Python, vous pouvez utiliser un dictionary comprehension. Ceci est la réponse équivalente elo80ka (qui a utilisé une compréhension de la liste), mais produit un code un peu plus lisible.

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