Python:从字典中提取键、值对 - 键包含特定文本
Python: Extract Key, Value Pairs From A Dictionary - Key Contains Specific Text
我目前有一本字典如下所示:
{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*)' 的东西。但是我不确定解决这个问题的最佳方法。我的主要目标是匹配所有以太网值,然后对它们进行计数。例如:在我有匹配所有 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
应该这样做:
new_dict = dict()
for key, value in orig_dict.items():
if 'Ethernet' in str(key):
new_dict[key] = value
当您使用 print
时,python 调用 OctetString
对象的 __str__
方法,即 returns Ethernet8/6
。但是,我认为 pprint
默认打印对象类型
编辑:
Stefan Pochmann 在下面正确地指出 if 'Ethernet' in
将匹配任何包含单词 Ethernet
的字符串。 OP 确实提到在他的 post 中使用正则表达式来匹配 Ethernet(\d*)/(\d*)
,因此这个答案可能不适合任何其他寻求解决类似问题的人。
(我将使用与接受的答案相同的 '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
版本更有用。
我目前有一本字典如下所示:
{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*)' 的东西。但是我不确定解决这个问题的最佳方法。我的主要目标是匹配所有以太网值,然后对它们进行计数。例如:在我有匹配所有 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
应该这样做:
new_dict = dict()
for key, value in orig_dict.items():
if 'Ethernet' in str(key):
new_dict[key] = value
当您使用 print
时,python 调用 OctetString
对象的 __str__
方法,即 returns Ethernet8/6
。但是,我认为 pprint
默认打印对象类型
编辑:
Stefan Pochmann 在下面正确地指出 if 'Ethernet' in
将匹配任何包含单词 Ethernet
的字符串。 OP 确实提到在他的 post 中使用正则表达式来匹配 Ethernet(\d*)/(\d*)
,因此这个答案可能不适合任何其他寻求解决类似问题的人。
(我将使用与接受的答案相同的 '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
版本更有用。