在Python中,我有一本字典.如何更改此词典的键?

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

密钥无法更改.您将需要添加具有修改值的新键,然后删除旧键,或创建具有词典理解等的新词典.

  • +1这实际上是对的(我不明白为什么人们在没有说明他们的反对意见的情况下进行投票)...... (7认同)
  • downvotes可能是因为你发现问题不是解决方案.这是可以解决的问题,而不是被问到的方式. (7认同)
  • 他是唯一一个回答这个问题的人,关键是无法改变的,这就是实际要求的问题.给予好评. (2认同)

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)

  • 同样在py2中工作,只是没有语法糖:`def transform(multilevelDict):return dict((str(key)+"abc",(如果isinstance(value,dict),则为transform(value)值)) ,multilevelDict.items()中的值`` (4认同)

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)


And*_*rew 6

我的理解是你无法更改密钥,并且需要创建一组新密钥并将其值分配给原始密钥指向的密钥.

我会这样做:

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)


Yuv*_*dam 5

我使用下面编写的实用程序函数,该函数接受一个目标字典和另一个包含翻译的字典,并根据该字典切换所有键:

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)


mgo*_*ser 5

这是一个紧凑的小函数:

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)