10

私は次のような辞書を持っています:

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

空の値を次のように削除したい:

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

関数を作成しました(Webで見つかった例に従って)

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/空の値を削除/削除する組み込み関数はありますか?

4

7 に答える 7

12

これにはビルトインはありません(AFAIK)が、辞書内包表記で簡単に実行できます:

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

古いバージョンの Python (dict 内包表記のない 2.7 より前) に行き詰まっている場合は、dict コンストラクターを使用できます。

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

これは適切に動作しないことに注意してください(2番目の質問に従って)。また、辞書はリストのようにスライスの割り当てをサポートしていないため、これをすべて適切に行うために実際にできる最善の*方法は次のとおりです。

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

※もちろん「最高」という言葉は完全に主観的なものです。

于 2013-02-11T13:54:00.643 に答える
8

関数を修正するには、 に変更del[k]del d[k]ます。辞書からその場で値を削除する機能はありません。

あなたがしていることは、変数を削除することkであり、辞書をまったく変更することではありません。これが、元の辞書が常に返される理由です。

書き換えると、関数は次のようになります。

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

これは、空のリストとNone値の両方を削除することを想定しており、実際には「偽」の値を持つアイテムをすべて削除します。

于 2013-02-11T13:59:24.490 に答える
5

辞書内包表記を使用できます: -

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

>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
于 2013-02-11T13:56:13.650 に答える
4
dict((k, v) for k, v in default.iteritems() if v)

これにより、空の文字列、空の辞書/タプル/リストではないすべてのアイテムがフィルター処理されます。

于 2013-02-11T13:57:28.487 に答える
2

もう1つのオプションは次のとおりです(新しいdictを作成せずに):

for e in [k for k,v in default.iteritems() if len(v) == 0]: default.pop(e)
于 2013-03-04T15:07:29.280 に答える
1

マイケルの答えは正しいです。

一歩下がると、これらの空のリストを作成することをまったく回避できる可能性があります。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']})
于 2013-02-11T14:22:57.123 に答える