根据具有子字符串的特定值删除字典项

时间:2019-06-30 07:07:51

标签: python python-3.x dictionary network-programming

我有一个字典,该字典基于来自Cisco交换机的命令“ show cdp neighbor detail”的输出。该词典有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'的值删除字典项。键“ platform”的相应值不应包含子字符串“ AIR-”,如上面的示例代码中的第三项所述。

请告知我该如何实现,我正在使用Python 3。

编辑 实际上,我想删除键“ platform”的值中具有子字符串“ AIR-”的字典。 而且,在第一次过滤之后,我希望从其余字典中检索“ local_port”的值,最好是在列表中。

2 个答案:

答案 0 :(得分:1)

您的问题还不清楚,如果特定值包含子字符串,您是要删除包含子字符串的项还是整个字典?

在第一种情况下,您可以按以下方式使用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")的字段的名称

答案 1 :(得分:0)

我认为在这种情况下,最好的选择是使用DataFrame。在词典中,您具有相同的项目键。因此,您可以通过一种简单的方式更改为数据框,它使您可以轻松地访问数据:

import pandas as pd

dic1 = {'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'}
dic2 = {'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'}
dic3 = {'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'}`

data = pd.DataFrame([dic1, dic2, dic3]);
data = data[data['platform'].str.contains("AIR") != True]