Элегантный способ удаления полей из вложенных словарей

Мне пришлось удалить некоторые поля из словаря, ключи для этих полей находятся в списке. Поэтому я написал эту функцию:

def delete_keys_from_dict(dict_del, lst_keys):
    """
    Delete the keys present in lst_keys from the dictionary.
    Loops recursively over nested dictionaries.
    """
    dict_foo = dict_del.copy()  #Used as iterator to avoid the 'DictionaryHasChanged' error
    for field in dict_foo.keys():
        if field in lst_keys:
            del dict_del[field]
        if type(dict_foo[field]) == dict:
            delete_keys_from_dict(dict_del[field], lst_keys)
    return dict_del

Этот код работает, но он не очень элегантный, и я уверен, что есть лучшее решение.

20
задан fasouto 8 April 2018 в 20:55
поделиться

2 ответа

def delete_keys_from_dict(dict_del, lst_keys):
    for k in lst_keys:
        try:
            del dict_del[k]
        except KeyError:
            pass
    for v in dict_del.values():
        if isinstance(v, dict):
            delete_keys_from_dict(v, lst_keys)

    return dict_del
18
ответ дан 29 November 2019 в 23:22
поделиться

Поскольку вам уже нужно перебрать каждый элемент в dict, я бы остановился на одном цикле и просто использовал набор для поиска ключей для удаления

def delete_keys_from_dict(dict_del, the_keys):
    """
    Delete the keys present in the lst_keys from the dictionary.
    Loops recursively over nested dictionaries.
    """
    # make sure the_keys is a set to get O(1) lookups
    if type(the_keys) is not set:
        the_keys = set(the_keys)
    for k,v in dict_del.items():
        if k in the_keys:
            del dict_del[k]
        if isinstance(v, dict):
            delete_keys_from_dict(v, the_keys)
    return dict_del
2
ответ дан 29 November 2019 в 23:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: