按值过滤字典的字典

Pau*_*ogl 3 python dictionary nested

我有一个嵌套字典的小例子(在我的例子中是一个集合defaultdict):

all_dict = {'d1': {'a': 2, 'b': 4, 'c': 10}, 
            'd2': {'a': 1, 'b': 23,'c': 0},
            'd3': {'a': 4, 'b': 12,'c': 4},
            'd4': {'a': 0, 'b': 4, 'c': 3},
            'd5': {'a': 4, 'b': 0, 'c': 1}}
Run Code Online (Sandbox Code Playgroud)

我想过滤 all_dict 中的所有零值。在我的真实数据中,嵌套字典非常大。我想要任何通用的“pythonic”解决方案。我尝试了一些理解,但失败了。我想要一些像:

all_dict_filtered = 
           {'d1': {'a': 2, 'b': 4, 'c': 10}, 
            'd2': {'a': 1, 'b': 23},
            'd3': {'a': 4, 'b': 12,'c': 4},
            'd4': {'b': 4, 'c': 3},
            'd5': {'a': 4, 'c': 1}}
Run Code Online (Sandbox Code Playgroud)

任何提示都会很棒。感谢您的时间和关注。保罗

我有这个,但很丑:

    filtered = defaultdict(dict)
    for k1, v1 in all_dict.items():
        for k2, v2 in v1.items():
            if v2 > 0:
                filtered[k1] = filtered.get(k1, {})
                filtered[k1][k2] = v2
defaultdict(dict,
            {'d1': {'a': 2, 'b': 4, 'c': 10},
             'd2': {'a': 1, 'b': 23},
             'd3': {'a': 4, 'b': 12, 'c': 4},
             'd4': {'b': 4, 'c': 3},
             'd5': {'a': 4, 'c': 1}})
Run Code Online (Sandbox Code Playgroud)

fun*_*man 6

使用字典理解的简单单行:

import pprint

all_dict = {
    'd1': {'a': 2, 'b': 4, 'c': 10},
    'd2': {'a': 1, 'b': 23, 'c': 0},
    'd3': {'a': 4, 'b': 12, 'c': 4},
    'd4': {'a': 0, 'b': 4, 'c': 3},
    'd5': {'a': 4, 'b': 0, 'c': 1}
}

pprint.pprint({k: {key: value for key, value in v.items() if value != 0} for k, v in all_dict.items()})
Run Code Online (Sandbox Code Playgroud)

输出:

{'d1': {'a': 2, 'b': 4, 'c': 10},
 'd2': {'a': 1, 'b': 23},
 'd3': {'a': 4, 'b': 12, 'c': 4},
 'd4': {'b': 4, 'c': 3},
 'd5': {'a': 4, 'c': 1}}
Run Code Online (Sandbox Code Playgroud)


And*_*ely 5

尝试:

all_dict = {
    "d1": {"a": 2, "b": 4, "c": 10},
    "d2": {"a": 1, "b": 23, "c": 0},
    "d3": {"a": 4, "b": 12, "c": 4},
    "d4": {"a": 0, "b": 4, "c": 3},
    "d5": {"a": 4, "b": 0, "c": 1},
}

for k, v in all_dict.items():
    all_dict[k] = {kk: vv for kk, vv in v.items() if vv != 0}

print(all_dict)
Run Code Online (Sandbox Code Playgroud)

印刷:

{
    "d1": {"a": 2, "b": 4, "c": 10},
    "d2": {"a": 1, "b": 23},
    "d3": {"a": 4, "b": 12, "c": 4},
    "d4": {"b": 4, "c": 3},
    "d5": {"a": 4, "c": 1},
}
Run Code Online (Sandbox Code Playgroud)