【问题标题】:Change json.dumps dictionary values in python在 python 中更改 json.dumps 字典值
【发布时间】:2016-05-04 07:40:25
【问题描述】:

所以我有以下字典:

my_dict{'key1': 'value1',
        'key2': 'value2',
        'key3': json.dumps([
           {"**subkey1**": "subvalue1", "**subkey2**": "subvalue2",},
           {"**subkey1**": "other_subvalue", "**subkey2**":"other_subvalue2"}])
       }

我需要以某种方式创建一个我必须检查的 def,并为每个 subkey2 仅更改 def 本身的值

和所有的subkey1检查它的值是否和第二个subkey1一样 请注意,我说的只是 subkey1,我有两次。

我不想手动设置它们。意味着我有这个 dict 全局,并从许多 def 调用它,所以我需要进行这些更改并检查每个 def 内部

我尝试的是:

def recurse_keys(my_dict, indent = ''):
    print(indent+str(key))
    if isinstance(my_dict[key], dict):
        recurse_keys(my_dict[key], indent+'   ')
recurse_keys(my_dict)

现在它只打印我所有的参数,但不知道如何继续

例子:

my_dict{'name': 'georgi',
        'famili': 'ivanov',
        'drinks': json.dumps([
           {"breakfast": "milk", "lunch": "beer",},
           {"breakfast": "tea",       "lunch":"vodka"}])
def test()
    ....check if both breakfast are the same and if not make them so....(all these, mean dict and the function it self are in same file)

所以我需要检查两个早餐的值是否相同(不知道它们),如果它们不一样,则使它们相同。

还要检查是否有空值或 0 的午餐,如果没有,则再次检查

【问题讨论】:

  • 您是否只是想让它以一种易于准备的方式打印出字典?您提到了更改 - 但您的示例函数没有更改 - 这是预期的吗?
  • 是的,它没有进行更改,因为我不知道如何进行更改....我需要更改第二个值,并比较第一个值。但不知道如何
  • 如果您所关心的只是使“早餐”子键的值相同,那么为什么不同时指定“0”或“牛奶”或其他值呢?如果您没有对它们做任何事情,为什么还需要检查这些值?

标签: python json dictionary nested


【解决方案1】:

如果你想编辑一个 json 字符串,那么可能最简单的方法是将其解码为 python 数据类型d = json.loads(str),对其进行编辑,然后将其编码回字符串str = json.dumps(d) (python JSON)。

import json

my_dict = {'name': 'georgi',\
        'famili': 'ivanov',\
        'drinks': json.dumps([\
           {"breakfast": "milk", "lunch": "beer",},\
           {"breakfast": "tea", "lunch":"vodka"}])};

ddict = json.loads(my_dict["drinks"]) # json str to python data types

seen = {}; # store the items already seen

# for each dictionary object in key3
for d in range(0,len(ddict)):
    for k in ddict[d]:
        if k in seen:
            # update the value to the one already seen
            ddict[d][k] = seen[k];

        if k == "lunch" and (ddict[d] == "" or ddict[d] is None):
            ddict[d] = alternative_lunch_value;

        else:
            seen[k] = ddict[d][k];

my_dict["drinks"] = json.dumps(ddict);

print(my_dict);

我机器上的结果是:

{'drinks': '[{"breakfast": "milk", "lunch": "beer"}, {"breakfast": "milk", "lunch": "beer"}]',
'famili': 'ivanov',
'name': 'georgi'}

更新字典值

因为您想更新my_dict 中的值,以便其他模块可以读取它,而不仅仅是读取值。如果您只想读取值,那么您可以遍历列表ddict,如下所示:

for value in ddict:
    print("Sub1:{0} Sub2:{1}\n".format(value["**subkey1**"], value["**subkey2**"]));

但是,由于您要更新现有列表中的值,因此您需要遍历索引列表。如下图...

Range() 和 len()

Range(start,end) 给出一个列表,其中包含从开始到结束的值。所以a = range(1,4)[1,2,3,4] 分配给a。同样len(a) 将返回列表中的项目数,因此在这种情况下为4。使用这些主体,您可以遍历您的 ddict

for d in range(1,len(ddict):
    ddict[d]["**subkey1**"] = new_value;

希望这有助于您入门。如果您更新您的问题,详细说明您想要什么(例如输入和输出示例,可能是伪代码),那么我们将能够为您提供更好的答案。

【讨论】:

  • 关键是我实际上不知道值本身是什么,所以如果它们相同,我需要匹配而不提供值。我只知道密钥,所以如果它们相同,我需要匹配 subkey1 的值是的,我将拥有将用于所有'def'的 gobal dict,并且在其中一些 defs 中,我需要更改subkey2 用于 def 的需要
  • 并且:我需要匹配两个具有相同名称和差异值的 subkey1,而不是 subkey1 和 subkey2。如果他们不具有相同的价值,使他们成为。我已经按照你的建议编辑了我的帖子,谢谢!
  • 好吧,恐怕我还是很难理解你的英语。你所说的'def'是什么意思?你的意思是你导入一个带有全局变量的模块并获取本地副本,然后调整其值以供本地使用?
  • 请阅读您更新后的问题。谢谢,这更清楚了。如果你发现不同的值,你想取哪个值作为实际值?第一个值?
  • 刚刚再次编辑它,在同一个 py 文件中我想创建一个检查它们的函数,第一个,实际上没关系,它只需要相同。就像午餐一样,它只需要变成 0 或空
猜你喜欢
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2019-07-17
相关资源
最近更新 更多