如何从Python中的嵌套字典中删除某些键?
我在Python3.8中这样做,但我还没有找到一个干净的解决方案 如果值等于0,我将尝试从嵌套字典中删除任何值 所以嵌套字典有点像这样:如何从Python中的嵌套字典中删除某些键?,python,Python,我在Python3.8中这样做,但我还没有找到一个干净的解决方案 如果值等于0,我将尝试从嵌套字典中删除任何值 所以嵌套字典有点像这样: {1: {"alert1" : 0, "alert2": 1, "alert3" : 3, "alert4": 1}, 2: {"alert1" : 45, "alert2": 2, "alert3" : 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个条目,还是只想打印非零条目?啊,我可能应该说清楚。修改字典根本不会影响它,但我只是想找到一种打印非零的方法。虽然我认为现在删除零可能会使长期运行更容易。你能展示你的尝试并解释失败的原因吗?