给定字符串路径的 Python 弹出嵌套 Json 键

标签 python python-3.x dictionary recursion

用例

我需要根据传递到我的脚本的可变长度字符串来 Pop() 嵌套 JSON 键。

示例

给定字典 {'IP': {'key1': 'val1', 'key2': 'val2'}} 如何 Pop() key1如果我的脚本以 IP.key1

的形式传递路径,则值不在字典中

请注意,这需要在给定任意数量的键的情况下工作。

到目前为止,我在 Stack 上找到了这个代码片段,它可以用来查找 key ,但我无法让它真正删除 key :

data = {'IP': {'key1': 'val1', 'key2': 'val2'}}
lst = ['IP', 'key1'] # Convert the string of keys to an array

def get(d,l):
    if len(l)==1: return d[l[0]]
    return get(d[l[0]],l[1:])

print(get(data, lst))

此外,我在受限制的环境中工作,因此不能选择使用任何利基库。

我觉得可能有一种简单的方法可以使其适应弹出完整路径,但递归让我很头疼。有什么想法吗?

编辑

Filip Müller 的答案似乎对我有用。但他没有提供太多上下文,因此我正在更新它以演示更复杂的数据集以及我根据 Filip 的答案使用的函数

data = {'IP': {'key1': {'key3': {'key4': 'val4', 'key5': 'val5'}}, 'key2': 'val2'}}
lst = ['IP', 'key1', 'key3', 'key4']


def popKey(d, l):
    current_level = d
    for key in l[:-1]:
        print(key)
        current_level = current_level[key]
        print(current_level)
    current_level.pop(l[-1])
    return d


print(popKey(data, lst))

最佳答案

data = {'IP': {'key1': 'val1', 'key2': 'val2'}}
lst = ['IP', 'key1']

current_level = data
for key in lst[:-1]:
    current_level = current_level[key]
current_level.pop(lst[-1])

说明

我将使用您提供的更复杂的示例来解释其工作原理。任务的第一部分是获取实际应从中删除键的字典。

{
  'IP': {
    'key1': {
      'key3': {
        'key4': 'val4',
        'key5': 'val5'
        }
      },
    'key2': 'val2'
    }
}

path = ['IP', 'key1', 'key3', 'key4']

在本例中,为了删除 key 'key4' ,我们首先需要获取到包含这个key的字典,也就是'key3'下的字典。如果我们在变量中有这个特定的字典,比如 d ,我们可以直接调用d.pop('key4') .

'key3': {
  'key4': 'val4',
   'key5': 'val5'
  }

这本字典的路径是data['IP']['key1']['key3'] 。该算法不是像这样直接进行,而是从根字典开始,并在 for 循环的每次迭代中更深一层。所以,在第一次迭代之后current_leveldata['IP'] 。下一个之后就变成data['IP']['key1'] 。 (因为 current_level 已经是 data['IP']current_level = current_level['key1'] 确实与 data['IP']['key1'] 相同。)

重复此过程,直到找到所需的字典。这意味着对列表中指定路径的每个元素(而不是最后一个元素)执行此操作,因为最后一个元素不再是字典,而是我们搜索的字典中的键。 ( lst[:1] 是 Python 表示 lst 中除最后一个元素之外的所有元素的方式。)

最后,我们只需从它实际所属的字典中弹出必要的键(列表中的最后一个元素,换句话说 lst[-1] ),即算法在第一步中找到的键。

关于给定字符串路径的 Python 弹出嵌套 Json 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73305897/

相关文章:

java - 创建 ECDSA DER 编码签名

python : Operator Overloading a specific type

javascript - 语法错误: "Cannot use import statement outside a module" - JavaScript in Python

python-3.x - python : How to replace "datetime" in a Dataframe with only the Day represented as integer value?

Python 将字符串解析为字典

python - 学习 Django - 很好的入门项目

python - 如何有效比较二维矩阵中的每一对行?

python-3.x - 如何在 PyGObject 中的 TextView 对象上添加占位符

python - 如何从Python字典中的多个数据框中过滤出行

java - 使用 int 作为 java.util.Dictionary 的类型参数