如何循环插入具有复杂结构的嵌套字典

时间:2019-01-31 09:40:07

标签: python dictionary

我有一个具有这种结构的dict对象

{"a": '{"b": "c"}'}

我想使用循环将不同的值插入"c"区域中,以便在项目中的其他地方使用。问题在于b和c周围的单引号使这一点变得更加困难。

我尝试过:

{"a": '{"b": "{}"}.format("d")'}

但是这将返回dict而不评估格式函数。

我也尝试过:

{"a": '{"b": "{}"}'.format("d")}

但是这将返回错误。我经历了2个小时的组合练习以及诸如(thisthisthis之类的问题,但我意识到我需要知道自己在做什么的人的帮助。

可行的解决方案如下:

x = {"a": '{"b": "c"}'}
val = "d"

magic(x, val)

>>> {"a": '{"b": "d"}'}

注意: 在评论中问“为什么使用这种格式”?我没有创建这些对象,因此它们不是我的选择。我有一个已连接的api。我正在提取当前数据,对其进行更改,然后将其上传回。没有机会“不使用字符串文字”。这就是api帖子所期望的。我现在无法要求维护者更改其存储系统

4 个答案:

答案 0 :(得分:3)

这应该为您工作

import json
obj = {"a": '{"b": "c"}'}
inner_a = json.loads(obj['a'])
inner_a['b'] = 'd'
obj['a'] = json.dumps(inner_a)

答案 1 :(得分:0)

尝试一下:

import ast
x = {"a": '{"b": "c"}'}
a = ast.literal_eval(x['a'])
a['b'] = 'd'
x['a'] = str(a)

现在:

print(x)

是:

{"a": '{"b": "d"}'}

答案 2 :(得分:0)

您正在尝试构建字符串文字,而直接构建dict更容易;本身不需要是字典文字的dict文字中的值就不需要了。问题在于d['a']的值是字符串而不是字典。这真的有必要吗?对于简单的字典,您可以简单地使用:

>>> def magic(d, val):
...     d['a']['b'] = val
...
>>> my_dict = {"a": {"b": "c"}}  # my_dict['a'] is also a dict
>>> magic(my_dict, 'd')
>>> my_dict
{'a': {'b': 'd'}}
>>> magic(my_dict, {'x': 1, 'y' :2, 'z': 3})
>>> my_dict
{'a': {'b': {'x': 1, 'y': 2, 'z': 3}}}

但是,当值为字符串时,很大程度上取决于其格式。如果键都是字符串,而值是字符串或数字,则可以使用json模块将其转换为字典,对其进行操作然后放回原处:

>>> import json
>>> def smagic(d, val):
...     inner = json.loads(d['a'])
...     inner['b'] = val
...     d['a'] = json.dumps(inner)
...
>>> my_dict = {"a": '{"b": "c"}'}  # my_dict['a'] is a string
>>> smagic(my_dict, "Is this it?")
>>> my_dict
{'a': '{"b": "Is this it?"}'}

您可以使用repreval扩展此解决方案,但我建议您避免这种复杂性,除非无法避免。

答案 3 :(得分:-1)

#use this code according for reference
print("enter name\n") 
n1=input("enter 1st name ")
ln=input("enter last name ")
add=input("enter address ")
dic={'name':{"1st name":n1,"lname":ln},'address':add}
print(dic.values())
print(dic)