通过键列表从嵌套的python词典中删除键

问题描述 投票:0回答:2

我有一个嵌套字典,即

a={'k1':{'k2':1}}

我想写一个函数

def f(dictionary,key_list):
      pass

这样f(a,['k1','k2'])相当于del(a['k1']['k2'])

我试着用

from functools import reduce
import operator

def f(dictionary,key_list):
     reduce(operator.delitem,key_list,dictionary)

然而

f(a,['k1','k2'])

回报

TypeError: 'NoneType' object does not support item deletion
python python-3.x dictionary
2个回答
2
投票

您只想从最里面的字典中删除,而不是从外部字典中删除。因此,要获取到最里面的字典的路径,您需要使用getitem,而不是delitem。只应使用最后一个键进行删除:

def f(dictionary, key_list):
    *path, key = key_list
    del reduce(operator.getitem, path, dictionary)[key]

演示(还有一个更清晰的级别):

from functools import reduce
import operator

def f(dictionary, key_list):
    *path, key = key_list
    del reduce(operator.getitem, path, dictionary)[key]

a = {'k1': {'k2': {'k3': 1}}}
f(a, ['k1', 'k2', 'k3'])
print(a)

打印{'k1': {'k2': {}}},与del a['k1']['k2']['k3']之后相同:

a = {'k1': {'k2': {'k3': 1}}}
del a['k1']['k2']['k3']
print(a)

3
投票

我会reducedict.get上除了找到最内层字典的最后一个关键字,然后使用最后一个关键字在del上调用dict

def f(dictionary,key_list):
    dictionary = reduce(dict.get, key_list[0:-1], dictionary)
    del dictionary[key_list[-1]]


a={'k1':{'k2':1}}
print(a)
f(a,['k1','k2'])
print(a)

结果:

$ python x.py 
{'k1': {'k2': 1}}
{'k1': {}}
© www.soinside.com 2019 - 2024. All rights reserved.