2009-03-13 9 views
15

私は(とりわけ)形式のdictsの配列として格納されるCSVファイルを(他のものの中で)読み取るプログラムに取り組んでいます[{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}])。各行について、他の処理の一環として、ユーザーが入力した値にこれらのキーを再マップする必要があります。これらの値は別のdictで提供され、API呼び出しのパラメーターとして使用できます。マッピング配列の形式は、{badname1:goodname1, badname2:goodname2,...}です。どのように私は、python dictのキーを再マップする

だから私はから取得したいのですが: {badname1:data1, badname2:data2,...}{goodname1:data1, goodname2:data2,...}

私は(zip()利回り{badname1:badname1,...}が)zip()のようなものを使用したいと思います。

私に言及している明らかな解決策があるようです。

EDIT:データがaにあり、 場合bでマッピング:

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

私が近づくが、それは唯一のフィールドが同じ順序であることが知られている場合に動作しますおもう。 Dict Comprehensions

答えて

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

それともPython2.7 +中:

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

イエップ。また、ジェネレータの式として[]がなくても動作します。 –

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] 

あなたが後にしている何本か?

4

Python 2.7またはPython 3.xを使用している場合は、dictionary comprehensionを使用できます。これは同等のelo80kaの答えです(リストの理解度を使用しています)が、少しわかりやすいコードを生成します。

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()} 
    ... 
関連する問題