T = {
    "dw-table": {
        "filters": "null",
        "column-vis": ["true", "true", "true", "true", "true", "true"],
        "disp-len": "15"
    },
    "st-table": {
        "filters": {
            "group": "5"
        },
        "disp-len": "100",
        "column-vis": ["true", "true", "true", "true", "true"]
    },
    "ls-table": {
        "filters": {
            "group": "0"
        },
        "column-vis": ["true", "true", "true", "true", "true", "true", "true", "true", "true", "true"],
        "disp-len": "15"
    },
    "proj-table": {
        "filters": {
            "group": "1",
            "links_count": {
                "begin": "1",
                "end": "",
                "type": "range"
            }
        }
    },
    "lsp-table": {
        "filters": {
            "group": "0",
            "links_count": "null"
        }
    }
}
 
def get(lis, name):
    if isinstance(name, str):
        name = name.split('/')[1:]
    if not isinstance(lis, dict):
        return lis
    return get(lis.get(name[0]), name[1:])
 
def editByXpath(dict, path, val):
    if isinstance(path, str):
        path = path.split('/')[1:]
    try:
        if path[0].isdigit():
            p = int(path[0])
        else:
            p = path[0]
        if len(path) == 1:
            dict[p] = val
            return
        else:
            editByXpath(dict[p], path[1:], val)
    except:
        raise KeyError()


def main():
    print get(T, '/dw-table/column-vis')
    print get(T, '/lsp-table/filters/group')
    editByXpath(T, '/lsp-table/filters/group', "lol")
    print get(T, '/lsp-table/filters/group')
 
if __name__ == '__main__':
    main()