簡體   English   中英

Python:一種從 Python 字典中刪除空列表的優雅方法

[英]Python: An elegant way to delete empty lists from Python dictionary

我有一本字典:

default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}

我希望消除空值:

default = {'a': ['alpha'], 'b': ['beta','gamma']}

我寫了一個函數(按照網上的一個例子)

def remove_empty_keys(d):
    for k in d.keys():
        try:
            if len(d[k]) < 1:
                del[k]
        except:
            pass
        return(d)

我有以下問題:

1-我沒有發現為什么它總是返回以下錯誤-

remove_empty_keys(default)
 {'a': ['alpha'], 'b': ['beta'], 'g': []}

2- 是否有內置函數可以在不創建原始字典副本的情況下從 Python 字典中消除/刪除 Null/None/空值?

沒有內置的(AFAIK),但是您可以使用字典理解輕松完成:

new_dict = {k:v for k,v in original_dict.items() if v}

如果您堅持使用舊版本的 python(2.7 之前沒有 dict 推導式),您可以使用 dict 構造函數:

new_dict = dict((k,v) for k,v in original_dict.items() if v)

請注意,這不會就地運行(根據您的第二個問題)。 並且字典不支持像列表那樣的切片分配,所以你真正能做的最好的事情是:

new_dict = {k:v for k,v in original_dict.items() if v}
original_dict.clear()
original_dict.update(new_dict)

*當然,“最佳”一詞完全是主觀的。

要修復您的函數,請將del[k]更改為del d[k] 沒有從字典中刪除值的功能。

您正在做的是刪除變量k ,根本不更改字典。 這就是為什么總是返回原始字典的原因。

重寫后,您的函數可能如下所示:

def remove_empty_keys(d):
    for k in d.keys():
        if not d[k]:
            del d[k]

這假設您要消除空列表和None值,並且實際上刪除具有“false”值的任何項目。

您可以使用字典理解: -

>>> default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}

>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
dict((k, v) for k, v in default.iteritems() if v)

這將過濾所有非空字符串、空字典/元組/列表的項目。

另一個選項如下(不創建新字典):

for e in [k for k,v in default.iteritems() if len(v) == 0]: default.pop(e)

邁克爾的回答是正確的。

退后一步,您可以通過使用collections.defaultdict(list)根本避免創建那些空列表

>>> import collections
>>> d = collections.defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> d["hobbits"].append("Frodo")
>>> d["hobbits"].append("Sam")
>>> d
defaultdict(<type 'list'>, {'hobbits': ['Frodo', 'Sam']})

如果值都是列表,那么你可以使用它們的真實性,你可以使用itertools.compress

from itertools import compress
d = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
new_d = dict(compress(d.items(), d.values()))
print(new_d)  # {'a': ['alpha'], 'b': ['beta', 'gamma']}

暫無
暫無

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

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