удалить элемент во вложенном файле по списку ключей - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть вложенная словарная структура, такая как:

dataDict = {
"a":{
    "r": 1,
    "s": 2,
    "t": 3
    },
"b":{
    "u": 1,
    "v": {
        "x": 1,
        "y": 2,
        "z": 3
    },
    "w": 3
    }
}    

со списком ключей:

maplist = ["b", "v", "y"]

Я хочу удалить элемент в поле, на которое указывает список карт. Есть предложения?

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Вы можете использовать рекурсию:

maplist = ["b", "v", "y"]
dataDict = {'a': {'s': 2, 'r': 1, 't': 3}, 'b': {'u': 1, 'w': 3, 'v': {'y': 2, 'x': 1, 'z': 3}}}  
def remove_keys(d):
  return {a:remove_keys(b) if isinstance(b, dict) else b for a, b in d.items() if a not in maplist}

final_result = remove_keys(dataDict)

Выход:

{'a': {'s': 2, 'r': 1, 't': 3}}
0 голосов
/ 26 апреля 2018

Это один из способов. В будущем, пожалуйста, обратитесь к на вопрос , где вы нашли эти данные.

getFromDict функция любезно предоставлено @ MartijnPieters .

from functools import reduce
import operator

def getFromDict(dataDict, mapList):
    return reduce(operator.getitem, mapList[:-1], dataDict)

maplist = ["b", "v", "y"]

del getFromDict(dataDict, maplist)[maplist[-1]]
0 голосов
/ 26 апреля 2018
for k in maplist:
    if k in dataDict:
        del dataDict[k]

Выход:

{'a': {'s': 2, 'r': 1, 't': 3}}
0 голосов
/ 26 апреля 2018

Просто используйте del после доступа:

del dataDict[maplist[0]][maplist[1]][maplist[2]]

, что дает:

dataDict = {
"a":{
    "r": 1,
    "s": 2,
    "t": 3
    },
"b":{
    "u": 1,
    "v": {
        "x": 1,
        "z": 3
    },
    "w": 3
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...