删除python dict中的一个级别,保留值

删除python dict中的一个级别,保留值,python,json,python-2.7,python-3.x,dictionary,Python,Json,Python 2.7,Python 3.x,Dictionary,我有以下python字典: 'load_balancers': {'App': {'DJMatcher': {'security_group': 'sg-618d1c05', 'service_name': 'djmatcher/svc', 'certificateId': 'net', 'health_check_path': '/djmatcherstatus/ma.html', 'DNS': {'fde': {'record_name': 'platform-enrichment-djma

我有以下python字典:

'load_balancers': {'App': {'DJMatcher': {'security_group': 'sg-618d1c05', 'service_name': 'djmatcher/svc', 'certificateId': 'net', 'health_check_path': '/djmatcherstatus/ma.html', 'DNS': {'fde': {'record_name': 'platform-enrichment-djmatcher', 'ttl': 60}}}}}
现在它基本上代表以下YAML:

 LoadBalancers:
    App:
        DJMatcher:
            certificateId: 'net'
            health_check_path: /djmatcherstatus/ma.html
            security_group: *svc_sg1
            service_name: *sn
            DNS:
                fde:
                    record_name: platform-enrichment-djmatcher
                    ttl: 60
我想删除第二级键-“App”,并保持其余的不变,这意味着生成的python字典应该是这样的:我删除了键App,但该值现在成为其父键“load_balancers”的值:


有什么好办法可以做到这一点吗?

尽管这个问题并不需要一个通用的解决方案,但我认为为了未来的搜索者的利益(万一OP将来遇到更复杂的情况),制定一个解决方案是值得的

derp['load_balancers'] = derp['load_balancers']['App']
这将递归运行,直到达到要删除的正确级别,然后向上复制所有子键

例如:

>>> d = {'load_balancers': {'App': {'DJMatcher': {'security_group': 'sg-618d1c05', 'service_name': 'djmatcher/svc', 'certificateId': 'net', 'health_check_path': '/djmatcherstatus/ma.html', 'DNS': {'fde': {'record_name': 'platform-enrichment-djmatcher', 'ttl': 60}}}}}}
>>> removeLevel(d, 1)

{'load_balancers': {'DJMatcher': {'security_group': 'sg-618d1c05', 'service_name': 'djmatcher/svc', 'certificateId': 'net', 'DNS': {'fde': {'record_name': 'platform-enrichment-djmatcher', 'ttl': 60}}, 'health_check_path': '/djmatcherstatus/ma.html'}}}

>>> d2 = {'a': {'b':1, 'e':{'f':4}}, 'c':{'d':2}}
>>> removeLevel(d2, 1)

{'a': {'f': 4}, 'c': {}}

>>> removeLevel(d2, 0)

{'b': 1, 'e': {'f': 4}, 'd': 2}

我在试图解决类似问题时发现了这个问题。上面有人给出了一个递归方法,但它使用Python2语法,只允许基于“级别”数字删除键,这不符合我的目的。下面是一个使用更现代语法的示例,允许指定要删除的键:

def remove_levels(在目录中,键为remove):
尝试:
结果={}
对于键,输入项()中的值:
如果输入要删除的按键:
结果={**result,**remove_levels(值,键\u到\u remove)}
其他:
结果[键]=删除\u级别(值、键\u到\u删除)
返回结果
除属性错误外:
以书面形式返回
你会像这样使用它:

负载平衡器={
“负载平衡器”:{
“DJMatcher”:{
'certificateId':'net',
“健康检查路径”:“/djmatcherstatus/ma.html”,
“安全组”:“*svc\U sg1”,
“服务名称”:“*sn”,
“DNS”:{
“fde”:{
“记录名称”:“平台匹配器”,
‘ttl’:60
}
}
}
}
}
删除_级别(负载平衡器,{“App”})
输出:

{'LoadBalancers':{'DJMatcher':{'certificateId':'net',
“健康检查路径”:“/djmatcherstatus/ma.html”,
“安全组”:“*svc\U sg1”,
“服务名称”:“*sn”,
'DNS':{'fde':{'record_name':'platform Enhancement djmatcher',
'ttl':60}

d['load\u balancers']=d['load\u balancers']['App']
?我做了:docs['load\u balancers']=docs['load\u balancers'].pop(v.keys()[0],None)有效,其中v是值。是的,但有一个缺点。如果您只对v字典的一个键感兴趣,但它有多个项,那么您会得到随机结果,因为dicts没有排序!您的方法基本上是“从v dict的‘load_balancers’的第一个随机项将第一个值放入docs dict”不要忘记字典中项目顺序的随机性。如果dt有超过1个键,则方法的结果会更改每次调用。
thedict['load_balancers'] = thedict['load_balancers'].pop('App')
dt[dt.keys()[0]] = dt[dt.keys()[0]].values()[0]
def removeLevel(d, level):
    if type(d) != type({}):
        return d

    if level == 0:
        removed = {}
        for k, v in d.iteritems():
            if type(v) != type({}):
                continue
            for kk, vv in v.iteritems():
                removed[kk] = vv
        return removed

    removed = {}
    for k, v in d.iteritems():
        removed[k] = removeLevel(v, level-1)
    return removed
>>> d = {'load_balancers': {'App': {'DJMatcher': {'security_group': 'sg-618d1c05', 'service_name': 'djmatcher/svc', 'certificateId': 'net', 'health_check_path': '/djmatcherstatus/ma.html', 'DNS': {'fde': {'record_name': 'platform-enrichment-djmatcher', 'ttl': 60}}}}}}
>>> removeLevel(d, 1)

{'load_balancers': {'DJMatcher': {'security_group': 'sg-618d1c05', 'service_name': 'djmatcher/svc', 'certificateId': 'net', 'DNS': {'fde': {'record_name': 'platform-enrichment-djmatcher', 'ttl': 60}}, 'health_check_path': '/djmatcherstatus/ma.html'}}}

>>> d2 = {'a': {'b':1, 'e':{'f':4}}, 'c':{'d':2}}
>>> removeLevel(d2, 1)

{'a': {'f': 4}, 'c': {}}

>>> removeLevel(d2, 0)

{'b': 1, 'e': {'f': 4}, 'd': 2}