Удалить элемент словаря на основе значения во вложенном словаре в списке

1

Я пытаюсь удалить элемент из вложенного словаря в списке. Следовательно, у меня есть список, в котором одним из элементов является словарь, а в свою очередь - словарь в качестве одного из ключевых значений. Я знаю ключи, которые я собираюсь использовать в самом верхнем списке и самом нижнем словаре, в то время как ключ в "среднем" словаре является переменным. Если значение в нижнем словаре не равно определенному значению, я хочу удалить элемент в "среднем" словаре.

Я подумал, что мне понадобится три вложенных цикла for, чтобы попасть в каждый словарь, но я не смог выяснить, как удалить элемент из "среднего" словаря.

Моя текущая попытка на данный момент:

#remove unneccessary elements
def getCleanResults(the_dict1):
    for elem1 in the_dict1:
        the_dict2 = elem['dict1_key']
        for key, elem2 in the_dict2.keys():
            the_dict3 = elem2[key]
            for elem3 in the_dict3:
                if 'keyWanted' in elem3:
                    del elem2
    return the_dict

Шаблон списка словарей у меня есть:

a = {
        {'key1':{'key1.1': {'delete': True, 'result': None},
        'key1.2': {'delete': False, 'result': None}},'key2': 3},
        {'key1':{'key1.1': {'delete': False, 'result': None},
        'key1.2': {'delete': True, 'result': None}},'key2': 5}
}

Я хочу удалить ключи keyx.x которые имеют под ними 'delete' которая имеет значение True, что, как в примере выше, приведет к:

a = {
    {'key1':{'key1.2': {'delete': False, 'result': None}},'key2': 3},
    {'key1':{'key1.1': {'delete': False, 'result': None}},'key2': 5}
}

Как видно из приведенного выше примера, они удаляют ключи key1.1 и key1.2 и, следовательно, являются переменными.

  • 0
    Я думаю, что у предоставленного вами вложенного словаря много синтаксических ошибок. Не могли бы вы исправить свой словарь так, чтобы он точно представлял вашу структуру данных и посмотреть, есть ли какие-либо синтаксические ошибки на вашем компьютере? Кроме того, я думаю, что вы имели в виду удалить ключи, которые имеют «удалить» как True в вашем последнем абзаце?
  • 0
    не является допустимым словарь. Пожалуйста, исправьте это.
Показать ещё 4 комментария
Теги:
python-3.x
dictionary
nested

3 ответа

0

Если вы используете правильный синтаксис для словаря a, вы можете перебирать ключи первого уровня, а затем, как вы сказали, выполнить вложенный цикл для перебора ключей второго уровня. Значение из the_dict1 [key1] [key2] является окончательным словарем. Я использовал pprint, чтобы помочь визуализировать словарь.

def getCleanResults(the_dict1):
    # iterate through the first keys, cast as a tuple to make a copy of the keys iterator (allows for changing dictionary size during iteration)
    for key1 in tuple(the_dict1.keys()):
        the_dict2 = the_dict1[key1]
        # iterate through the second tier keys
        for key2 in tuple(the_dict2.keys()):
            if the_dict1[key1][key2]['delete']:
                del the_dict1[key1][key2]
    # no need to return a new dict, it was passed by reference, we modified the original dict. If you wanted a copy of the dict, make copy and return it instead.

Словарь в правильном формате:

a = {
    'key1.1': {'key1.1.1': {'delete': True, 'loremipsum': 'perhaps'},
                'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
    'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
            'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
    'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
            'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
    'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'},
            'key2.2.2': {'delete': True, 'loremipsum': 'perhaps'}}
}

Тестирование:

from pprint import pprint

getCleanResults(a)
print()
pprint(a)

Выход:

{'key1.1': {'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
 'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
            'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
 'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
            'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
 'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'}}}
0

Вы можете попробовать вот так.

Фрагмент кода

import json

def delete_items(d):
    keys1 = d.keys()
    new_d = {}

    for key1 in keys1:
        keys2 = d[key1].keys();
        for key2 in keys2:
            if type(d[key1][key2]) is dict:
                if d[key1][key2]["delete"] == False:
                    if key1 in new_d:
                        new_d[key1][key2] = d[key1][key2]
                    else:
                        new_d[key1] = {key2: d[key1][key2]}
            else:
                if key1 in d:
                    new_d[key1] = {key2: d[key1][key2]}
                else:
                    new_d[key1][key2] = d[key1][key2]

    return new_d


a = {
        "key1.1": {
            "key1.1.1": {
                "delete": True,
                "loremipsum": "perhaps"
            },
            "key1.1.2": {
                "delete": False,
                "loremipsum": "perhaps"
            },
            "key1.1.3": 4
        },
        "key1.2": {
            "key1.2.1": {
                "delete": False,
                "loremipsum": "perhaps"
            },
            "key1.2.2": {
                "delete": False,
                "loremipsum": "perhaps"
            }
        },
        "key2.1": {
            "key2.1.1": {
                "delete": False,
                "loremipsum": "perhaps"
            },
            "key2.1.2": {
                "delete": False,
                "loremipsum": "perhaps"
            },
            "key2.1.3": 9
        },
        "key2.2": {
            "key2.2.1": {
                "delete": False,
                "loremipsum": "perhaps"
            },
            "key2.2.2": {
                "delete": True,
                "loremipsum": "perhaps"
            },
            "key2.2.3": 2
        }
    }

d = delete_items(a)
print(json.dumps(d, indent=4))

Выход

{
    "key1.2": {
        "key1.2.1": {
            "delete": false,
            "loremipsum": "perhaps"
        },
        "key1.2.2": {
            "delete": false,
            "loremipsum": "perhaps"
        }
    },
    "key1.1": {
        "key1.1.3": 4,
        "key1.1.2": {
            "delete": false,
            "loremipsum": "perhaps"
        }
    },
    "key2.1": {
        "key2.1.3": 9
    },
    "key2.2": {
        "key2.2.3": 2
    }
}
0

Я полагаю, ваша борьба связана с ограничением Python до изменения словаря во время итерации. Чтобы сделать то, что вы хотите, вам нужно сделать копию своего диктата - либо сделать копию, итерировать, и удалить ключи из оригинального; или переберите исходный и вставьте "отфильтрованные" ключи в новый. Позже можно сделать с

b = {k1: {k2: v2 for k2, v2 in v1.items() if not v2['delete']}
     for k1, v1 in a.items()}

РЕДАКТИРОВАТЬ: по какой-то причине в коде, который вы предоставили, нет согласованности, решение выше предполагает, что структуры на самом деле

a = {'key1.1': {'key1.1.1': {'delete': True, 'loremipsum': 'perhaps'},
                'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.2.2': {'delete': True, 'loremipsum': 'perhaps'}}
}

b = {'key1.1': {'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'}}
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню