2013-07-29 2 views
9

で辞書のキー(文字列)を置き換える、私は別の言語でのキーで辞書を次ていますCSVのインポート後のPython

dic = {'voornaam': 'John', 'Achternaam': 'Davis', 'telephone': '123456', 'Mobielnummer': '234567'} 

今私は(もすべて小文字に)英語とにキーを変更したいです。どのようにする必要があります:

dic = {'first_name': 'John', 'last_name': 'Davis', 'phone': '123456', 'mobile': '234567'} 

どうすればいいですか?あなたは辞書型を持つ

+1

なぜdownvotes?なぜ私は質問を改善することができるかを知る必要があると思う。 – chhantyal

+0

質問はあまり研究努力をしていません。たとえば、どのアプローチがあなたにとって理にかなっていますか?それらのいずれかを実装しようとしましたか?あなたが試したときに何が起こったのですか? – kojiro

答えて

23

は、それが完璧にフィットNO入力のdict辞書オブジェクトがネストされている場合は溶液上の

>>> dic = {'voornaam': 'John', 'Achternaam': 'Davis', 'telephone': '123456', 'Mobielnummer': '234567'} 
>>> tr = {'voornaam':'first_name', 'Achternaam':'last_name', 'telephone':'phone', 'Mobielnummer':'mobile'} 
>>> dic = {tr[k]: v for k, v in dic.items()} 
{'mobile': '234567', 'phone': '123456', 'first_name': 'John', 'last_name': 'Davis'} 
+0

は偉大に見える、ありがとう:) – chhantyal

+0

私はOPが値をlowecaseに変換したいとは思わない、私は何かを逃した? –

+0

はい、キーは英語で、すべて小文字で、値ではありません。 – chhantyal

1
name_mapping = { 
    'voornaam': 'first_name', 
    ... 
} 

dic = your_dict 

# Can't iterate over collection being modified, 
# so change the iterable being iterated. 
for old, new in name_mapping.iteritems(): 
    value = dic.get(old, None) 
    if value is None: 
     continue 

    dic[new] = value 
    del dic[old] 
1

は素晴らしい作品はありません。

以下は、既存のキーを再帰的に新しいキーセットに置き換える、より一般化されたユーティリティ関数です。

def update_dict_keys(obj, mapping_dict): 
    if isinstance(obj, dict): 
     return {mapping_dict[k]: update_dict_keys(v, mapping_dict) for k, v in obj.iteritems()} 
else: 
    return obj 

テスト:

dic = {'voornaam': 'John', 'Achternaam': 'Davis', 
'telephone':'123456', 'Mobielnummer': '234567', 
"a": {'Achternaam':'Davis'}} 
tr = {'voornaam': 'first_name', 'Achternaam': 'last_name', 
'telephone':'phone', 'Mobielnummer': 'mobile', "a": "test"} 

出力:

{ 
'test': { 
    'last_name': 'Davis' 
}, 
'mobile': '234567', 
'first_name': 'John', 
'last_name': 'Davis', 
'phone': '123456' 
} 
関連する問題