В Python у меня есть словарь. Как мне изменить ключи этого словаря? - PullRequest
19 голосов
/ 06 февраля 2010

Допустим, у меня довольно сложный словарь.

{'fruit':'orange','colors':{'dark':4,'light':5}}

В любом случае, моя цель - сканировать каждый ключ в этом сложном многоуровневом словаре. Затем добавьте «abc» в конец каждой клавиши.

Так что будет:

{'fruitabc':'orange','colorsabc':{'darkabc':4,'lightabc':5}}

Как бы вы это сделали?

Ответы [ 14 ]

0 голосов
/ 15 октября 2013

Я использую это для преобразования Docopt-совместимых ключей командной строки POSIX в ключи PEP8

(например, "--option" -> "option", "" -> "option2", "FILENAME" -> "filename")


arguments = docopt.docopt(__doc__)  # dictionary
for key in arguments.keys():
    if re.match('.*[-<>].*', key) or key != key.lower():
        value = arguments.pop(key)
        newkey = key.lower().translate(None, '-<>')
        arguments[newkey] = value
0 голосов
/ 26 июля 2013
for k in theDict: theDict[k+'abc']=theDict.pop(k)
0 голосов
/ 05 октября 2011

Вы также должны учитывать, что во вложенных списках существует возможность вложенных диктов, которые не будут охвачены вышеупомянутыми решениями. Эта функция рекламирует префикс и / или постфикс для каждой клавиши в пределах dict.

def transformDict(multilevelDict, prefix="", postfix=""):
"""adds a prefix and/or postfix to every key name in a dict"""
new_dict = multilevelDict
if prefix != "" or postfix != "":
    new_key = "%s#key#%s" % (prefix, postfix)
    new_dict = dict(map(lambda (key, value): (new_key.replace('#key#', str(key)), value), new_dict.items()))
    for key, value in new_dict.items():
        if isinstance(value, dict):
            new_dict[key] = transformDict(value, prefix, postfix)
        elif isinstance(value, list):
            for index, item in enumerate(value):
                if isinstance(item, dict):
                    new_dict[key][index] = transformDict(item, prefix, postfix)
return new_dict
0 голосов
/ 06 февраля 2010

Вы можете сделать это с помощью рекурсии:

import collections
in_dict={'fruit':'orange','colors':{'dark':4,'light':5}}

def transform_dict(d):
    out_dict={}
    for k,v in d.iteritems():
        k=k+'abc'
        if isinstance(v,collections.MutableMapping):
            v=transform_dict(v)            
        out_dict[k]=v
    return out_dict
out_dict=transform_dict(in_dict)
print(out_dict)

# {'fruitabc': 'orange', 'colorsabc': {'darkabc': 4, 'lightabc': 5}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...