Python:从字典中提取键,值对 - 键包含特定文本

时间:2015-05-11 17:22:40

标签: python search dictionary count

我目前有一个字典,如下所示:

{OctetString('Ethernet8/6'): Integer(1),
 OctetString('Ethernet8/7'): Integer(2),
 OctetString('Ethernet8/8'): Integer(2),
 OctetString('Ethernet8/9'): Integer(1),
 OctetString('Vlan1'): Integer(2),
 OctetString('Vlan10'): Integer(1),
 OctetString('Vlan15'): Integer(1),
 OctetString('loopback0'): Integer(1),
 OctetString('mgmt0'): Integer(1),
 OctetString('port-channel1'): Integer(1),
 OctetString('port-channel10'): Integer(1),
 OctetString('port-channel101'): Integer(1),
 OctetString('port-channel102'): Integer(1)}

我希望我的字典看起来像这样:

{OctetString('Ethernet8/6'): Integer(1),
 OctetString('Ethernet8/7'): Integer(2),
 OctetString('Ethernet8/8'): Integer(2),
 OctetString('Ethernet8/9'): Integer(1)}

我不确定找到这些键值对的最佳方法是什么。我真的想要任何匹配'\ Ethernet(\ d *)/(\ d *)'的东西。但是我不确定最好的方法。我的主要目标是匹配所有以太网值,然后计算它们。例如:在我将dict与所有Ethernetx / x匹配后,我想计算1和2的数量。

另外,为什么我在迭代字典和打印时只获得Ethernet8 / 6,但是当我打印字典时,我最终得到了OctetString('Ethernet8 / 6')?

for k in snmp_comb: print k
Ethernet2/18
Ethernet2/31
Ethernet2/30
Ethernet2/32
Ethernet8/46

2 个答案:

答案 0 :(得分:1)

这应该这样做:

new_dict = dict()
for key, value in orig_dict.items():
    if 'Ethernet' in str(key):
        new_dict[key] = value

当您使用print时,python会调用__str__对象上的OctetString方法,该方法返回Ethernet8/6。但是,我认为 pprint默认打印对象类型。

修改

Stefan Pochmann在下面正确地指出if 'Ethernet' in将匹配包含单词Ethernet的任何字符串。 OP确实提到在他的帖子中使用正则表达式来匹配Ethernet(\d*)/(\d*),所以这个答案可能不适合任何想要解决类似问题的人。

答案 1 :(得分:1)

(我将使用与接受的答案相同的'Ethernet' in str(key)测试。)

如果您想保留原始字典并将过滤后的版本作为单独的字典,我会使用理解:

newdict = {key: value
           for key, value in mydict.items()
           if 'Ethernet' in str(key)}

如果您不想保留原始字典,您也可以删除不需要的条目:

for key in list(mydict):
    if 'Ethernet' in str(key):
        del mydict[key]

你得到“OctetString('...')”的原因与此相同:

>>> 'foo'
'foo'
>>> pprint.pprint('foo')
'foo'
>>> print('foo')
foo

前两个测试显示了您可以在源代码中使用的表示,这就是为什么有引号。这就是repr函数带给你的东西。第三个测试打印正常愉悦的值,因此不添加引号。 “OctetString('...')”也就是这样的表示,你可以将它复制并粘贴到源代码中并再次获得实际的OctetString对象,而不是Python字符串对象。我想pprint主要用于开发,其中获取完整的repr版本更有用。