Python 更改字典中的值
我想知道如何使用键列表和1个值来更改字典中的值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
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()