Невозможно удалить ключ словаря внутри json с помощью функции del.получение TypeError - PullRequest
0 голосов
/ 13 февраля 2019

Код укорочен для этого примера, я перебираю его, как если бы он имел несколько ключей.

string = '''
{
    "people":
    {
        "a":
        {
            "parent":
            {
                "father": "x"
            }
        }
    }
}
'''

data = json.loads(string)

Я проверяю, что мой условный текст работает, он выводит " ok ", так что все в порядке.

for name in data["people"].values():
    if name["parent"]["father"] == "x":
        print("ok")

Затем я изменяю код выше, чтобы удалить этот ключ, и получаю следующую ошибку:

TypeError: unhashable type: 'dict'

for name in data["people"].values():
    if name["parent"]["father"] == "x":
        del data["people"][name]

Что я делаю не так?

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Попробуйте это:

import json
string = '''
{
    "people":
    {
        "a":
        {
            "parent":
            {
                "father": "x"
            }
        }
    }
}
'''

data = json.loads(string)
l = []

for key, values in data["people"].items():
    if values["parent"]["father"] == "x":
        l.append(key)

for x in l:
    data["people"].pop(x)

print(data)
0 голосов
/ 13 февраля 2019

Вы пытаетесь использовать name в качестве ключа, но name на самом деле является словарем, а не строкой.Используйте .items(), чтобы получить как имя, так и содержимое:

for name, contents in data["people"].items():
    if contents["parent"]["father"] == "x":
        del data["people"][name]

Однако обратите внимание, что это также не будет работать.Вы не можете изменить размер словаря во время итерации.Вы можете заставить .items() полностью потреблять, позвонив по номеру list или подобному:

for name, contents in list(data["people"].items()):
    if contents["parent"]["father"] == "x":
        del data["people"][name]

В конце концов, data будет просто {'people': {}}, что, как я считаю, то, что вы хотите.

...