Python 更改字典中的值

Python 更改字典中的值,python,list,dictionary,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

我想知道如何使用键列表和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中的值
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'}}}
你可以写:

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

您需要一个具有可作为属性访问的键的dict。您可以通过子类化dict类来实现这一点,并根据需要添加支持。我认为这是一个更为通灵的解决方案,因为它更为直观:

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构建dict。如果将常规的口述添加到此口述中,则不起作用

这也支持设置新值:

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

我想下面的函数就是您要找的,它可以处理任意数量的键,如果还不存在的话,可以创建中间字典

d={
“鲍勃”:{
“姓名”:{
“first”:“FirstName”,
“last”:“LastName”
},
“作业”:“开发人员”
}
}
def更新由expr(d,expr)执行:
键\u值=表达式拆分('='))
keys=keys_值[0]。拆分('.'))
值=键\u值[1]
项目=d
而len(键)>1:
key=keys.pop(0)
如果项目中没有输入密钥:
项[键]={}
项目=项目[关键]
键=键[0]
项[键]=值
印刷品(d)
通过表达式(d'bob.name.first=bob Junior'更新命令
由expr(d,'bob.name.birth.date=2017年1月1日')更新
通过表达式(d,'bob.name.birth.place=NYC'更新目录
印刷品(d)

这是正确的,但是,如果插入bob.name.last=lastname,我的dict[key[0]][key[1]]=值将中断。因此,我认为应该使用循环来完成此操作,但我无法找到方法。我想创建一个脚本,它接收两个参数:1:yaml文件2:value to change。它应该看起来像myscript.py employees.yaml bob.name.first=bob结果是脚本将employees.yaml中的bob.name.first值更改为bob。因此,第二个参数实际上是一个来自用户“bob.name.first=bob”的字符串
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()