首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:提取键,从字典中提取值对-键包含特定文本

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

Stack Overflow用户
提问于 2015-05-11 17:22:39
回答 2查看 2.2K关注 0票数 0

我现在有一本字典,看起来像这样:

代码语言:javascript
复制
{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)}

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

代码语言:javascript
复制
{OctetString('Ethernet8/6'): Integer(1),
 OctetString('Ethernet8/7'): Integer(2),
 OctetString('Ethernet8/8'): Integer(2),
 OctetString('Ethernet8/9'): Integer(1)}

我不知道找到这些键值对的最佳方法是什么。我真的想要任何与‘\以太网(\d*)/(\d*)’匹配的东西。不过,我不知道如何才能做到这一点。我的主要目标是匹配所有的以太网值,然后计数它们。例如:当我拥有匹配所有Ethernetx/x的数据后,我想要计算1和2的数量。

另外,当我迭代并打印字典时,为什么只得到Ethernet8 8/6,而当我将字典按下时,我得到的是OctetString(‘Ethernet8 8/6’)。

代码语言:javascript
复制
for k in snmp_comb: print k
Ethernet2/18
Ethernet2/31
Ethernet2/30
Ethernet2/32
Ethernet8/46
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-11 17:35:15

这应该可以做到:

代码语言:javascript
复制
new_dict = dict()
for key, value in orig_dict.items():
    if 'Ethernet' in str(key):
        new_dict[key] = value

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

编辑:

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-11 18:02:36

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

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

代码语言:javascript
复制
newdict = {key: value
           for key, value in mydict.items()
           if 'Ethernet' in str(key)}

如果不想保留原来的dict,也可以删除不想要的条目:

代码语言:javascript
复制
for key in list(mydict):
    if 'Ethernet' in str(key):
        del mydict[key]

你得到“OctetString(‘.’)”的原因和这个一样:

代码语言:javascript
复制
>>> 'foo'
'foo'
>>> pprint.pprint('foo')
'foo'
>>> print('foo')
foo

前两个测试向您展示了可以在源代码中使用的表示形式,这就是为什么会有引号。这就是repr函数带给您的东西。第三个测试输出正常乐趣的值,因此不添加引号。“OctetString(.)”也就是这样的表示,您可以将其复制并粘贴到源代码中,并再次获得实际的OctetString对象,而不是Python对象。我想pprint主要用于开发,在那里获得完整的repr版本更有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30173885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档