用例
我需要根据传递到我的脚本的可变长度字符串来 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_level
是 data['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/