2017-05-29 9 views
0

辞書を含む辞書があります。辞書には無限の辞書も含まれています。入れ子になっている辞書にマップされているキーを除いて、すべての辞書のすべてのキーを変更したいと思います。私はこのような何かをしたいのか、キーは不変であることを理解:任意の深さの辞書のPython辞書のキーの名前を変更する方法

layer[item + '_addition'] = layer.pop(item) 

私が今持っていることは次のとおりです。

def alterKeys(item, layer=topLevelDict): 
    if isinstance(item, dict): 
     for i in item: 
      alterKeys(item[i], item) 
    else: 
     layer[item + '_addition'] = layer.pop(item) 

これは動作しません、それは継続的に再帰的に移動するよう最後の行がキーの代わりにdictから値をポップしようとするまでツリーを下ろして、KeyErrorを発生させます。 私は解決策に近いと知っていますが、私はこれについて数分間考えていましたが、私はそれを理解できないようです。

答えて

1

この質問を書いているうちに、私はそれを理解しました。誰かが同じ質問をしている場合に備えて、私はこれを投稿したいと思った。

誰かがもっと優雅な解決方法を持っていれば、私はそれを見たいと思っています。私はちょうどそれを介してjsonファイルを実行して、このスクリプトをテストし、正確に私が望んでいた辞書にマッピングされていないすべてのキーの名前を変更しました。

私は、ネストされた辞書にマッピングされたものを含む、名前を変更するすべてのキーを望んでいた場合、私の代わりにこのコードを使用することができます:あなたはpython2を使用している場合)(.iteritemsを使用することを覚えて、

def alterKeys(item, layer=topLevelDict, key=None): 
    if isinstance(item, dict): 
     for k, v in item.items(): 
      alterKeys(v, item, k) 
    if isinstance(key, str): 
     layer[key + '_addition'] = layer.pop(key) 

を.items()の代わりに、isinstance(key、str)の代わりにisinstance(key、basestring)を使用します。

関連する問題