如何从Python的嵌套字典中删除某些键?

时间:2020-06-24 20:16:21

标签: python

我正在Python 3.8中执行此操作,但我无法完善一个干净的解决方案。

如果值等于0,我正在尝试从嵌套字典中删除所有值。

所以嵌套字典有点像这样:

{1: {"alert1" : 0, "alert2": 1, "alert3" : 3, "alert4": 1},
2: {"alert1" : 45, "alert2": 2, "alert3" : 0, "alert4": 54},
3: {"alert1" : 2, "alert2": 1, "alert3" : 33, "alert4": 11},
4: {"alert1" : 1, "alert2": 0, "alert3" : 2, "alert4": 0}}

因此,如果我要打印或查看它,但前提是警报不为0 所以print(nested_dic)看起来像这样。

1 - alert2: 1    alert3: 3    alert4: 1
2 - alert1: 45   alert2: 2    alert4: 54
3 - alert1: 2    alert2: 1    alert3: 33    alert3: 11
4 - alert1: 1    alert3: 2    

编辑:删除非零或保存不带零的新字典以打印出来。

2 个答案:

答案 0 :(得分:2)

如果您只有一层嵌套,我认为在理解内使用理解仍然是可读的,因此我建议这样做(d是您的字典):

>>> {k: {k_sub: v_sub for k_sub, v_sub in v.items() if v_sub != 0} for k, v in d.items()}

{1: {'alert2': 1, 'alert3': 3, 'alert4': 1},
 2: {'alert1': 45, 'alert2': 2, 'alert4': 54},
 3: {'alert1': 2, 'alert2': 1, 'alert3': 33, 'alert4': 11},
 4: {'alert1': 1, 'alert3': 2}}

但是也许您更喜欢更详细的代码并添加更多名称,以便于阅读:

def non_zero(alerts):
    return {code: value for code, value in alerts.items() if value != 0}

all_alerts = {1: {"alert1" : 0, "alert2": 1, "alert3" : 3, "alert4": 1},
2: {"alert1" : 45, "alert2": 2, "alert3" : 0, "alert4": 54},
3: {"alert1" : 2, "alert2": 1, "alert3" : 33, "alert4": 11},
4: {"alert1" : 1, "alert2": 0, "alert3" : 2, "alert4": 0}}

all_non_zero_alerts = {identifier: non_zero(alerts) for identifier, alerts in all_alerts.items()}

这与以前完全相同,但是可能会更清楚代码实现的目的。

答案 1 :(得分:1)

我的解决方案是使用列表理解。这最适合迭代和删除所有不需要的项目。这是一个如何工作的示例:

 Passport::routes();
            \Route::group(['middleware' => ['web', 'auth', 'throttle:60,1']], function ($router) {
                $router->post('/oauth/clients', [
                    'uses' => '\Laravel\Passport\Http\Controllers\ClientController@store',
                    'as' => 'passport.clients.store',
                ]);
            });

在这里,您正在执行的唯一过滤操作发生在迭代循环中,如果值不为0,则在其中循环所有键。

此解决方案是可取的,因为它使用Pythonic字典理解,它使您可以在一条简单的行中整齐地迭代各个字典中的每个项目。相对于循环,这是一种更有益的方法,因为Python可以轻松地优化列表理解以提高效率。

变化

如果要修改现有字典,则只需在对其进行迭代时对其进行修改,如下所示:

dic = {1: {"alert1" : 0, "alert2": 1, "alert3" : 3, "alert4": 1},
2: {"alert1" : 45, "alert2": 2, "alert3" : 0, "alert4": 54},
3: {"alert1" : 2, "alert2": 1, "alert3" : 33, "alert4": 11},
4: {"alert1" : 1, "alert2": 0, "alert3" : 2, "alert4": 0}}

for key in dic:
    value = dic[key]
    keys = {k:v for (k, v) in value.items() if v != 0}
    print(keys)

如果要复制,只需创建另一个字典并添加它:

for key in dic:
    value = dic[key]
    updated = {k:v for (k, v) in value.items() if v != 0}
    dic[key] = updated

可以看到这些方法here(已注释)

相关问题