python - 根据具有子字符串的特定值删除字典项
问题描述
我有一本基于 Cisco 交换机的命令“显示 cdp 邻居详细信息”输出的字典。该字典有 200 多个键值对。示例字典对如下。
{'device_id': 'Switch-Hostname1', 'ip_address': '1.1.1.1', 'platform': 'Cisco IP Phone', 'capabilities': 'Host Phone Two-port Mac Relay', 'local_port': 'GigabitEthernet1/1', 'remote_port': 'Port 1'}
{'device_id': 'Phone-Hostname2', 'ip_address': '2.2.2.2', 'platform': 'WS-C3750', 'capabilities': 'Switch IGMP', 'local_port': 'GigabitEthernet1/2', 'remote_port': 'FastEthernet1/0/48'}
{'device_id': 'AccessPoint-Hostname3', 'ip_address': '3.3.3.3', 'platform': 'AIR-CAP3700-K9', 'capabilities': 'Trans-Bridge Source-Route-Bridge IGMP', 'local_port': 'GigabitEthernet1/3', 'remote_port': 'GigabitEthernet0'}
我需要根据字典键“平台”的值删除字典项。键 'platform' 的对应值不应包含子字符串“AIR-”,如上面示例代码的第三个条目中所述。
请告诉我如何实现这一点,我使用的是 Python 3。
编辑 实际上我想删除键“平台”的值中具有子字符串“AIR-”的字典。而且,在第一次过滤之后,我想从剩余的字典中检索“local_port”的值,最好是在一个列表中。
解决方案
您的问题有点不清楚,如果特定值具有子字符串,您是否要求仅删除包含子字符串的项目或整个字典?
在第一种情况下,您可以按如下方式使用 dict 理解:
orig = {'device_id': 'AccessPoint-Hostname3', 'ip_address': '3.3.3.3', 'platform': 'AIR-CAP3700-K9', 'capabilities': 'Trans-Bridge Source-Route-Bridge IGMP', 'local_port': 'GigabitEthernet1/3', 'remote_port': 'GigabitEthernet0'}
new = {k: v for k, v in orig.items() if substr not in v}
在第二种情况下,您可以使用列表推导:
info_old = [{'device_id': 'Switch-Hostname1', 'ip_address': '1.1.1.1', 'platform': 'Cisco IP Phone', 'capabilities': 'Host Phone Two-port Mac Relay', 'local_port': 'GigabitEthernet1/1', 'remote_port': 'Port 1'},
{'device_id': 'Phone-Hostname2', 'ip_address': '2.2.2.2', 'platform': 'WS-C3750', 'capabilities': 'Switch IGMP', 'local_port': 'GigabitEthernet1/2', 'remote_port': 'FastEthernet1/0/48'},
{'device_id': 'AccessPoint-Hostname3', 'ip_address': '3.3.3.3', 'platform': 'AIR- CAP3700-K9', 'capabilities': 'Trans-Bridge Source-Route-Bridge IGMP', 'local_port': 'GigabitEthernet1/3', 'remote_port': 'GigabitEthernet0'}]
info_new = [r for r in info_old if not substr in r[field]]
substr
您要避免的字符串在哪里( "AIR-"
)并且field
是您正在查看的字段("platform"
在您的情况下)
编辑: 这个问题经过编辑,现在更清楚了。对于第一部分,给定的解决方案应该按预期工作:
info_new = [r for r in info_old if not substr in r[unwanted_field]]
对于第二部分,你可以做另一个列表理解:
ports = [r[wanted_field] for r in info_new]
或者,如果您不需要清理过的字典列表来处理其他任何事情,您可以将其合并到一个单一的理解中,如下所示:
ports = [r[wanted_field] for r in info_old if not substr in r[unwanted_field]]
其中info_old
是原始字典列表、substr
要解析的部分 ( "AIR-"
)、wanted_field
具有要隔离的值的字段名称 ( "local_port"
) 和unwanted_field
要搜索的字段名称substr
( "platform"
)
推荐阅读
- android - 从另一个 Activity/Class kotlin 读取 SQL 数据
- python - Python中图中的列数据错误
- c# - 用于连接到 Rest Web 服务的 HttpWebRequest 在控制台上有效,但在 .net core 3.1 中的 Web 应用程序上无效
- node.js - GKE REST/Node API 调用以获取池中的节点数?
- javascript - 如何使用 nvim 本机 lsp 摆脱特定的 tsserver 错误?
- python - lask.cli.NoAppException:在导入“app”时,引发了 ImportError:
- jwt - JWT 密钥轮换
- asp.net-core - Asp.net core 通过modelBuilder.Entity添加软删除
()。财产 (“已删除”);但 isDeleted 作为复合键 - sql-server - 有什么方法可以从 EF Core 获得比“数据为 Null。无法在 Null 值上调用此方法或属性”更具体的错误?
- nuxt.js - Nuxt:无法从 js 文件访问 vuex 存储