更改字典中的值

时间:2017-10-11 10:03:40

标签: python list dictionary

我想知道如何使用键列表和1值

更改字典中的值
my_dict = {
    'bob': {
        'name': {'first': 'FirstName', 'last': 'LastName'},
        'job': 'Developer'
    }
}

string1 = 'bob.name.first=Bob'
string1 = string.split('=')
string2 = string1[0].split('.')
string2.append(string[1])

这里我最终得到了4个项目的列表,前3个是键,最后一个是值。

如果我想更改bob.job = QA

,考虑到可以更改给定的列表键编号,如何使用此给定列表更改my_dict中的值?

5 个答案:

答案 0 :(得分:2)

你可以写:

string1 = 'bob.name.first=Bob'
string1,string2 = string1.split('=')
string1 = string1.split('.')
my_dict[string1[0]][string1[1]][string1[2]] = string2

答案 1 :(得分:0)

如果您想更新Bob的工作,可以使用my_dict['bob']['job']

访问它
my_dict = {
    'bob': {
        'name': {'first': 'FirstName', 'last': 'LastName'},
        'job': 'Developer'
    }
}

my_dict['bob']['job'] = 'QA'

print(my_dict)
>> {'bob': {'name': {'last': 'LastName', 'first': 'FirstName'}, 'job': 'QA'}}

或拆分你的字符串:

my_dict = {
    'bob': {
        'name': {'first': 'FirstName', 'last': 'LastName'},
        'job': 'Developer'
    }
}

bobjob_key_value = 'bob.job=QA'
key, value = bobjob_key_value.split('=')
key = key.split('.')
my_dict[key[0]][key[1]] = value

print(my_dict)

>> {'bob': {'job': 'QA', 'name': {'last': 'LastName', 'first': 'FirstName'}}}

答案 2 :(得分:0)

你想要一个带有可以作为属性访问的键的dict。您可以通过子类化 dict类来实现,并添加对您的需求的支持。我认为这是更多的pythonic解决方案,因为它更直观:

class MyDict(dict):
    def __getattr__(self, attr):
        return self[attr] if attr in self.keys() else None

    def __setattr__(self, attr, value):
        self[attr] = value

my_dict = MyDict({
    'bob': MyDict(
        {'name':
         MyDict({'first': 'FirstName', 'last': 'LastName'}),
         'job':'Developer'})})

>>> my_dict.bob
{'job': 'Developer', 'name': {'last': 'LastName', 'first': 'FirstName'}}
>>> my_dict.bob.job
'Developer'
>>> my_dict.bob.name
{'last': 'LastName', 'first': 'FirstName'}

它需要一些开销,因为您需要根据MyDict构建您的dicts。如果添加到此词典中,常规词汇将无法奏效。

这也支持设置新值:

>>> my_dict.bob.job = 'QA'
>>> my_dict.bob.job
'QA'

答案 3 :(得分:0)

我认为以下函数是您正在寻找的,它适用于任意数量的键并创建中间词词典(如果尚不存在)。

d = {
    'bob': {
        'name': {
            'first': 'FirstName', 
            'last': 'LastName'
        },
        'job': 'Developer'
    }
}

def update_dict_by_expr(d, expr):
    keys_value = expr.split('=')
    keys = keys_value[0].split('.')
    value = keys_value[1]
    item = d
    while len(keys) > 1:
        key = keys.pop(0)
        if key not in item:
            item[key] = {}
        item = item[key]
    key = keys[0]
    item[key] = value

print(d)
update_dict_by_expr(d, 'bob.name.first=Bob Junior')
update_dict_by_expr(d, 'bob.name.birth.date=01/01/2017')
update_dict_by_expr(d, 'bob.name.birth.place=NYC')
print(d)

答案 4 :(得分:0)

import yaml


def get_dictionary_replace_value(file, new_value, strip_qoutes=True):

    with open(file, 'r') as rf:
        yaml_doc = yaml.load(rf)
        rf.close()

    key, value = new_value.split('=')
    keys = key.split('.')
    inner_dict = yaml_doc

    for i in keys[:-1]:
        inner_dict = inner_dict[i]
    inner_dict[keys[-1]] = value

    with open(file, 'w') as wf:
        if strip_qoutes:
            wf.write(yaml.dump(yaml_doc, 
            default_flow_style=False).replace("'", "").replace('"', ""))
        else:
            wf.write(yaml.dump(yaml_doc, default_flow_style=False))
    wf.close()