[英]How do I remove certain keys from a nested dictionary in 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
编辑:要么删除非零,要么保存一个不打印零的新字典。
如果你只有一层嵌套,我认为在理解中使用理解仍然是可读的,所以我建议这样做( 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()}
这与以前完全相同,但可能更清楚代码要实现的目标。
我的解决方案是使用列表理解。 这最适合迭代和删除任何不需要的项目。 这是一个如何工作的示例:
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 迭代循环中,如果值不为 0,则循环遍历所有键。
此解决方案更可取,因为它使用 Pythonic 字典理解,它允许您在一个简单的行中巧妙地迭代单个 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
这些方法可以在这里看到(注释掉)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.