TIM*_*MEX 20 python dictionary
假设我有一本非常复杂的字典.
{'fruit':'orange','colors':{'dark':4,'light':5}}
Run Code Online (Sandbox Code Playgroud)
无论如何,我的目标是扫描这个复杂的多级字典中的每个键.然后,将"abc"附加到每个键的末尾.
所以它将是:
{'fruitabc':'orange','colorsabc':{'darkabc':4,'lightabc':5}}
Run Code Online (Sandbox Code Playgroud)
你会怎么做?
Ign*_*ams 37
密钥无法更改.您将需要添加具有修改值的新键,然后删除旧键,或创建具有词典理解等的新词典.
And*_*Dog 15
例如这样:
def appendabc(somedict):
return dict(map(lambda (key, value): (str(key)+"abc", value), somedict.items()))
def transform(multilevelDict):
new = appendabc(multilevelDict)
for key, value in new.items():
if isinstance(value, dict):
new[key] = transform(value)
return new
print transform({1:2, "bam":4, 33:{3:4, 5:7}})
Run Code Online (Sandbox Code Playgroud)
这会将"abc"附加到字典中的每个键以及任何字典值.
编辑:还有一个非常酷的Python 3版本,请查看:
def transform(multilevelDict):
return {str(key)+"abc" : (transform(value) if isinstance(value, dict) else value) for key, value in multilevelDict.items()}
print(transform({1:2, "bam":4, 33:{3:4, 5:7}}))
Run Code Online (Sandbox Code Playgroud)
Joh*_*ooy 10
>>> mydict={'fruit':'orange','colors':{'dark':4,'light':5}}
>>> def f(mydict):
... return dict((k+"abc",f(v) if hasattr(v,'keys') else v) for k,v in mydict.items())
...
>>> f(mydict)
{'fruitabc': 'orange', 'colorsabc': {'darkabc': 4, 'lightabc': 5}}
Run Code Online (Sandbox Code Playgroud)
我的理解是你无法更改密钥,并且需要创建一组新密钥并将其值分配给原始密钥指向的密钥.
我会这样做:
def change_keys(d):
if type(d) is dict:
return dict([(k+'abc', change_keys(v)) for k, v in d.items()])
else:
return d
new_dict = change_keys(old_dict)
Run Code Online (Sandbox Code Playgroud)
我使用下面编写的实用程序函数,该函数接受一个目标字典和另一个包含翻译的字典,并根据该字典切换所有键:
def rename_keys(d, keys):
return dict([(keys.get(k), v) for k, v in d.items()])
Run Code Online (Sandbox Code Playgroud)
因此,使用初始数据:
data = { 'a' : 1, 'b' : 2, 'c' : 3 }
translation = { 'a' : 'aaa', 'b' : 'bbb', 'c' : 'ccc' }
Run Code Online (Sandbox Code Playgroud)
我们得到以下内容:
>>> data
{'a': 1, 'c': 3, 'b': 2}
>>> rename_keys(data, translation)
{'aaa': 1, 'bbb': 2, 'ccc': 3}
Run Code Online (Sandbox Code Playgroud)
这是一个紧凑的小函数:
def keys_swap(orig_key, new_key, d):
d[new_key] = d.pop(orig_key)
Run Code Online (Sandbox Code Playgroud)
对于您的特定问题:
def append_to_dict_keys(appendage, d):
#note that you need to iterate through the fixed list of keys, because
#otherwise we will be iterating through a never ending key list!
for each in d.keys():
if type(d[each]) is dict:
append_to_dict_keys(appendage, d[each])
keys_swap(each, str(each) + appendage, d)
append_to_dict_keys('abc', d)
Run Code Online (Sandbox Code Playgroud)