从嵌套字典中删除空字符串键,dict理解

问题描述 投票:2回答:2

这有效:

def delete_empty_keys(d):

    new_d = {}
    for key,value in d.items():
        if key != '' and not isinstance(value, dict):
            new_d[key] = value
        elif key != '' and isinstance(value, dict):
            new_d[key] = delete_empty_keys(value)
        else:
            pass
    return new_d

如何将其变成字典理解?我试过这个,但我不能让它工作,我最后应该有一个else pass

def delete_empty_keys(d):
    return {key: value
    if key != '' and not isinstance(value, dict)
    else delete_empty_keys(value)
    if key != '' and isinstance(value, dict)
    #else pass??
    for key, value in d.items()
    }
python dictionary dictionary-comprehension
2个回答
3
投票

你的循环

for key,value in d.items():
    if key != '' and not isinstance(value, dict):
        new_d[key] = value
    elif key != '' and isinstance(value, dict):
        new_d[key] = delete_empty_keys(value)
    else:
        pass

实际上只是测试是否应该跳过该键,或者如果不是,则如何处理该值。如果您将密钥测试拉出到单独的if语句,则可以将其重写为

for key, value in d.items():
    if key != '':
        if not isinstance(value, dict):
            new_d[key] = value
        else:
            new_d[key] = delete_empty_keys(value)

所以if key != '':测试实际上是过滤项目,选择哪些应该是新词典的一部分。理解中的过滤是在循环中使用额外的if组件完成的:

<item> for <target> in <iterable> if <test>  # optional: more for loops and if tests

if <test>部分过滤可迭代,限制使用的项目。在词典理解中使用相同的词汇。

这留下了内部if...else测试,可以用条件表达式表示(在两个选项之间选取):

# iteration, for <target> in <iterable>
for key, value in d.items():
    # filter, if <test>
    if key != '':
        # <item>, here a <key> and <value> expression for the dict comprehension
        new_d[key] = value if not isinstance(value, dict) else delete_empty_keys(value)

现在您有一个可以转换为字典理解的表单:

{
    key: value if not isinstance(value, dict) else delete_empty_keys(value)
    for key, value in d.items()
    if key != ''
}

或者,在你的功能中:

def delete_empty_keys(d):
    return {key: value if not isinstance(value, dict) else delete_empty_keys(value)
            for key, value in d.items() if key != ''}

1
投票

好吧,如果你真的想这样做:

def delete_empty_keys(d):
    return {k: delete_empty_keys(v) if isinstance(v, dict) 
            else v 
            for k, v in d.items() if k != ''}

例:

d = {'': 'delete_me',
     'a': {'': {'delete': 'me',
                'me': 'too'},
           'dont': 'delete_me',
           'keep': 'me'},
     'b': {'': 'bye'},
     'c': 'not_nested'}

delete_empty_keys(d)

输出:

{'a': {'dont': 'delete_me', 'keep': 'me'}, 'b': {}, 'c': 'not_nested'}

你在pass理解中没有dict,因为pass没有返回任何东西。理解中的一切都应该归还一些东西。

此外,正如评论中所述:None != ''

© www.soinside.com 2019 - 2024. All rights reserved.