2017-05-29 43 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) 

这是不行的,因为它会不断递归旅行直到最后一行试图从字典中弹出一个值,而不是一个会引发KeyError的键。 我知道我很接近解决方案,但我一直在想这个问题几分钟,我似乎无法弄清楚。

回答

1

在写这个问题的时候,我想到了。我想我会发布这个以防其他人在某个时候有相同的问题。

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

如果有人有更优雅或更好的解决方案,我很乐意看到它。我只是通过运行一个json文件来测试这个脚本,它重命名了每个没有映射到字典的键,这正是我想要的。

如果我想每一个键被重新命名,包括那些映射到嵌套的字典,我可以用这个代码,而不是:如果您使用python2

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) 

,记得用.iteritems()而不是.items(),并使用isinstance(key,basestring)而不是isinstance(key,str)。