从 Python 中的嵌套字典中删除键
Remove keys from a nested Dictionary in Python
从嵌套字典中删除键:
- 使用
for
循环遍历要删除的键集合。 - 从字典中删除所有直接键。
- 迭代字典的值并递归地删除指定的键。
主程序
def remove_nested_keys(dictionary, keys_to_remove): for key in keys_to_remove: if key in dictionary: del dictionary[key] for value in dictionary.values(): if isinstance(value, dict): remove_nested_keys(value, keys_to_remove) return dictionary my_dict = { 'address': { 'country': 'Finland', 'city': 'Oulu', }, 'name': 'Frank', 'age': 30, } # 👇️ {'address': {'country': 'Finland'}, 'name': 'Frank'} print(remove_nested_keys(my_dict, ['city', 'age']))
这个函数改变了原始字典。如果您更愿意使用更新的键值对创建新字典,请向下滚动到下一个副标题。
我们创建了一个可重用的函数,它接受一个字典和一个键列表,并从字典中删除指定的嵌套和非嵌套键。
第一步是遍历要删除的键列表。
主程序
for key in keys_to_remove: if key in dictionary: del dictionary[key]
在每次迭代中,我们检查字典中是否存在该键,如果满足条件,我们将删除该键。
与字典一起使用时,
in
运算符会检查对象中是否存在指定的键dict
。此for
循环负责删除所有指定的非嵌套键。
下一步是迭代字典的值。
主程序
for value in dictionary.values(): if isinstance(value, dict): remove_nested_keys(value, keys_to_remove)
dict.values方法返回字典
值的新视图。
主程序
my_dict = {'id': 1, 'name': 'bobbyhadz'} print(my_dict.values()) # 👉️ dict_values([1, 'bobbyhadz'])
在每次迭代中,我们检查当前值是否是一个字典,如果满足条件,我们调用
remove_nested_keys
带有嵌套字典和要删除的键列表的函数。然后该函数再次遍历键列表并使用该del
语句删除指定的键。
如果传入的对象是传入类的实例或子类,则isinstance
函数返回。True
主程序
# 👇️ True print( isinstance({'site': 'bobbyhadz.com'}, dict) ) # 👇️ False print( isinstance(['a', 'b', 'c'], dict) )
该函数就地从嵌套字典中删除键。换句话说,它改变了原始dict
对象。
从嵌套字典中删除键而不改变原始键
从嵌套字典中删除键:
- 使用
for
循环遍历字典的项目。 - 检查每个密钥是否不在要删除的密钥列表中。
- 如果当前键不是字典,则将键值对添加到新字典中。
- 如果键是字典,则递归调用该函数。
主程序
# ✅ function returns new dictionary (does NOT mutate original) def remove_nested_keys(dictionary, keys_to_remove): new_dict = {} for key, value in dictionary.items(): if key not in keys_to_remove: if isinstance(value, dict): new_dict[key] = remove_nested_keys(value, keys_to_remove) else: new_dict[key] = value return new_dict my_dict = { 'address': { 'country': 'Finland', 'city': 'Oulu', }, 'name': 'Frank', 'age': 30, } result = remove_nested_keys(my_dict, ['country', 'name']) print(result) # 👉️ {'address': {'city': 'Oulu'}, 'age': 30} result = remove_nested_keys(my_dict, ['city', 'age']) print(result) # 👉️ {'address': {'country': 'Finland'}, 'name': 'Frank'}
我们使用for
循环来遍历字典的项目。
dict.items方法返回字典
项((键,值)对)的新视图。
主程序
my_dict = {'id': 1, 'name': 'BobbyHadz'} # 👇️ dict_items([('id', 1), ('name', 'BobbyHadz')]) print(my_dict.items())
在每次迭代中,我们检查当前键是否不是要删除的键之一。
主程序
for key, value in dictionary.items(): if key not in keys_to_remove: if isinstance(value, dict): new_dict[key] = remove_nested_keys(value, keys_to_remove) else: new_dict[key] = value
然后该isinstance()
函数检查键是否指向字典值。
如果键存储字典,remove_nested_keys
则使用嵌套字典和要删除的键列表调用该函数。
如果键不存储字典,则键值对将添加到新字典中。
该函数返回新构造的字典,不包括列表中的所有键。