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

时间:2019-04-28 12:55:59

标签: python dictionary dictionary-comprehension

这有效:

$new_text = preg_replace('/([b-df-hj-np-tv-z])([b-df-hj-np-tv-z])/i', '$1-$2', $text);

var_dump($new_text);
// string(23) "ab-ce d-fia jic-d f-bii"

如何将其转化为字典理解?我已经尝试过了,但是无法正常工作,我应该在末尾加上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

2 个答案:

答案 0 :(得分: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 :(得分: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 != ''