【问题标题】:How to create a dictionary from slices of nested dictionary?如何从嵌套字典切片创建字典?
【发布时间】:2017-05-23 09:16:38
【问题描述】:

我有一本像这样的字典:

dictionary = {
    "key1" : 
        {
         "key11" : ["a", "b"],
         "key12" : "c"
        },
    "key2": "d",
    "key3": 
        {
         "key31" : ["e", "f"],
         "key32" : "g"
        }
}

我想创建另一个字典,其中包含第一个字典的部分内容。这样做的目的是使我的脚本的用户能够将他想要从旧文件中提取的密钥传递给新文件。我希望新字典的形状如下:

dictionary_bis = {
    "key1" : 
        {
          "key11" : ["a", "b"]
        },
    "key3" : 
        {
          "key32": "g"
        }
}

我现在拥有的是这样的:

dictionary_1 = {}
dictionary_1["key1"] = {}
dictionary_1["key1"]["key11"] = dictionary["key1"["key11"]
dictionary_1["key3"] = {}
dictionary_1["key3"]["key32"] = dictionary["key3"]["key32"]

这似乎是一种不好的方式,因为每次用户更改他想要提取的密钥时,我都需要再次对其进行硬编码。必须有一些更优雅的方式来做到这一点。

编辑

澄清:我在 mongodb 的一个集合中有一个巨大的文档,我的软件的用户希望能够创建一个新文档,其中包含第一个文档中的一些数据并将其保存在另一个集合中。这就是我想出的。如果您愿意,它可以是从一本字典到另一本字典的某些元素的副本。

【问题讨论】:

  • 好吧....您的选择背后有什么逻辑吗?因为如果不是,您不妨输入
  • 为什么你认为这是一个不好的方式?

标签: python json dictionary


【解决方案1】:

你可以用字典理解来做到这一点:

keys_to_keep = ("key1", "key3")
new_dict = {k:v for k, v in old_dict.items() if k in keys_to_keep}

如果您可以安全地假设键从不重复,并且只有 2 级嵌套,您可以尝试:

keys_to_keep = ("key1", "key12", "key3", "key32")
new_dict = {}


for k, v in dictionary.items():

    if k not in keys_to_keep:
        continue

    if isinstance(v, dict):
        d = {subk: subv for subk, subv in v.items() if subk in keys_to_keep}
        new_dict[k] = d
    else:
        new_dict[k] = v

注意:要处理副本而不是对原始字典的引用,请通过调用 dictionary = old_dict.copy() 或使用 copy 模块通过 deep copying 处理副本。

对于任意嵌套字典:

from copy import deepcopy

def prunedict(old_dict, keys_to_keep, copy=False):

    new_dict = {}

    if copy:
        old_dict = deepcopy(old_dict)

    for k, v in old_dict.items():

        if k not in keys_to_keep:
            continue

        if isinstance(v, dict):
            d = prunedict(v, keys_to_keep, copy=False)
            # if d == {}: continue  ## In case you don't want empty entries.
            new_dict[k] = d
        else:
            new_dict[k] = v

    return new_dict

【讨论】:

  • 虽然没有给出预期的输出
  • 对,他有任意嵌套的字典。没有考虑到这一点。我会看看我想出什么
  • 还要注意 dict 有一些可变值。也许OP想要一份副本。老实说,在 OP 澄清之前,我不会回答这个问题。
  • 还有什么需要澄清的吗?
  • 您是否可以拥有与更高级别密钥相同的子密钥? IE。 dictionary_1["key1"]["key1"]dictionary_1["key3"]["key1"]。你有任意嵌套,还是只有 2 级嵌套?
猜你喜欢
  • 1970-01-01
  • 2018-11-09
  • 2018-03-27
  • 1970-01-01
  • 2020-09-26
  • 2021-04-04
  • 2018-11-28
  • 2021-02-20
相关资源
最近更新 更多