Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python中的嵌套字典中删除某些键?_Python - Fatal编程技术网

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

如何从Python中的嵌套字典中删除某些键?,python,Python,我在Python3.8中这样做,但我还没有找到一个干净的解决方案 如果值等于0,我将尝试从嵌套字典中删除任何值 所以嵌套字典有点像这样: {1: {"alert1" : 0, "alert2": 1, "alert3" : 3, "alert4": 1}, 2: {"alert1" : 45, "alert2": 2, "alert3" : 0, "

我在Python3.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时 所以打印(嵌套的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    

编辑:要么删除非零,要么保存一本没有要打印的零的新词典。

我的解决方案是使用列表理解。这是迭代和删除任何不需要的项的最佳方法。下面是一个如何工作的示例:

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 iteration循环上,如果值不是0,则循环遍历所有键

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

变体

如果要修改现有字典,只需在迭代时修改键,如下所示:

for key in dic:
    value = dic[key]
    updated = {k:v for (k, v) in value.items() if v != 0}
    dic[key] = updated
如果要复制,只需创建另一个字典并添加它:

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

如果您只有一个嵌套级别,则可以看到(注释掉)这些方法。我认为在理解中使用理解仍然是可读的,因此我建议这样做(
d
是您的字典):

>{k:{k_sub:v_sub代表k_sub,v.items()中的v_sub如果v_sub!=0}代表k,v代表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非零(警报):
返回{code:code的值,alerts.items()中的值,如果值!=0}
所有警报={1:{“警报1”:0,“警报2”:1,“警报3”:3,“警报4”:1},
2:{“警报1”:45,“警报2”:2,“警报3”:0,“警报4”:54},
3:{“警报1”:2,“警报2”:1,“警报3”:33,“警报4”:11},
4:{“警报1”:1,“警报2”:0,“警报3”:2,“警报4”:0}
all_non_zero_alerts={标识符:标识符为non_zero(alerts),所有_alerts.items()中的alerts

这与之前的操作完全相同,但可能更清楚代码实现了什么。

您想修改字典以删除0个条目,还是只想打印非零条目?啊,我可能应该说清楚。修改字典根本不会影响它,但我只是想找到一种打印非零的方法。虽然我认为现在删除零可能会使长期运行更容易。你能展示你的尝试并解释失败的原因吗?