【问题标题】:Add values to an existing dictionary key in Python将值添加到 Python 中的现有字典键
【发布时间】:2020-04-12 10:54:14
【问题描述】:

我需要将字典值附加到已经存在的 JSON 文件中。我怎样才能做到这一点?

我的 details.json 文件

{"name": "someName"}

我的python脚本生成的字典

list1 = {"name": "someOthername"}

with open("details.json") as r:
    data = json.load(r)
    desirableDict = data.append(list1) # It has to be something like this
    print(desirableDict)

理想的输出:{"name": ["someName", "someOthername"]}

【问题讨论】:

  • 如果一个键可能有多个值,请使用列表即使只有一个。这样,您的代码就可以使用一致的访问模式,而无需编写来分别处理两种不同的情况。
  • 请注意,在密切相关的问题Merging dictionary value lists in Python 上确实有一个excellent answer by @jpp。
  • ...顺便说一句,“必须是这样的”并没有真正提供足够的细节来说明“这样的”是什么意思,让人们判断答案是否响应。跨度>
  • @CharlesDuffy 我不知道我可以在那里放什么,虽然代码的输出很清楚。
  • 输出确实很清楚,但如果您不是说“必须是这样的”这句话来进一步限制哪种实现(导致该输出)是可以接受的,那为什么会出现呢?

标签: python json python-3.x


【解决方案1】:

你可以检查一个for循环中的所有键,并将json文件和list1的值放在一个列表中,如下所示:

import json

list1 = {"name": "someOthername"}

with open("details.json") as file:

    data = json.load(file)
    desirableDict = data.copy()

    for key in data:
        if key in list1:

            if type(data[key]) is list:
                data[key].append(list1[key])
            else:
                desirableDict[key] = [data[key],list1[key]]

print(desirableDict)

【讨论】:

  • 好多了。我仍然更喜欢 Alexandr 的回答,因为它鼓励了良好的做法(例如使用与人们打算持有的内容一致的数据结构,而不是与当下正确的价值观一致的数据结构),但这在客观上不再是错误的。
  • @JeanExtreme002 您好,感谢您提供此解决方案。即使 list1 有几个不同的键,它也能完美运行。
  • data[key].extend([list1[key],]) 是data[key].append(list1[key]) 的一种非常奇怪的写法。另外,你可以直接for key in data,不用打电话.keys()
【解决方案2】:

您似乎需要对结构进行深度合并。我想推荐你使用这个很棒的库https://pypi.org/project/deepmerge/。

有很多你想要实现的例子。

from deepmerge import always_merger

base = {"foo": ["bar"]}
next = {"foo": ["baz"]}

expected_result = {'foo': ['bar', 'baz']}
result = always_merger.merge(base, next)

assert expected_result == result

【讨论】:

    猜你喜欢
    • 2013-09-19
    • 2013-10-11
    • 1970-01-01
    • 2019-11-21
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多