簡體   English   中英

從嵌套字典中刪除空字符串鍵,字典理解

[英]Remove empty string keys from nested dictionary, dict comprehension

這有效:

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()
    }

你的循環

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 != ''}

好吧,如果您真的想要這樣做:

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 != ''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM