当键很奇怪时将列表映射到字典
mapping a list to a dict when the keys are weird
我想在 Check_MK 的清单插件中处理来自 TP-Link 交换机的 LLDP 数据。
TP-Link 交换机不使用 LLDP 的标准 SNMP OID,并且他们的自定义 MIB 有一个 weird 怪癖。他们没有将索引放在 OID 的末尾,而是放在 OID 的中间。
[[[u'1.1.99353.1', u'Te1/0/25'], [u'1.2.99353.1', u'1'], [u'1.3.99353.1', u'MAC address'], [u'1.4.99353.1', u'00:zzzzzzz'], [u'1.5.99353.1', u'MAC address'], [u'1.6.99353.1', u'00:zzzzzzzz'], [u'1.7.99353.1', u'120'], [u'1.8.99353.1', u'Port 25'], [u'1.9.99353.1', u'THE_HOST_NAME'], [u'1.11.99353.1', u'Bridge Router'], [u'1.12.99353.1', u'Bridge Router'], [u'shortened', u'for brevity']]
所以在正常行星上,我希望像 99353.8 和 99353.9 或者 99353.1.[=23= 这样的东西]8 和 99353.1.9。他们在这里 (1.X.99353.1) 所做的事情很奇怪。我不知道该怎么办。
我所知道的是我必须对其进行标准化,但我太笨了,做不到。
这就是我想用它做的:
{
l_id : 99353.1 # from the "index"
l_ifname : u'Te1/0/25' # from 1.1
r_ifname : u'Port 25' # from 1.8
r_hostname : u'THE_HOST_NAME' # from 1.9.
}
映射这个(只是列表的一个子集,同时拆分 key-to-be 完全超出了我的技能水平。我想避免花半天时间用一堆 for-循环。特别是因为这应该向上游到社区项目,我不希望任何人伤害他们的眼睛。
是否有一些聪明的方法可以让我将其分解为 2-3 个较小的问题?
您可以使用 string.split 对索引进行字典:
list_ = [[u'1.1.99353.1', u'Te1/0/25'], [u'1.2.99353.1', u'1'], [u'1.3.99353.1', u'MAC address'], [u'1.4.99353.1', u'00:zzzzzzz'], [u'1.5.99353.1', u'MAC address'], [u'1.6.99353.1', u'00:zzzzzzzz'], [u'1.7.99353.1', u'120'], [u'1.8.99353.1', u'Port 25'], [u'1.9.99353.1', u'THE_HOST_NAME'], [u'1.11.99353.1', u'Bridge Router'], [u'1.12.99353.1', u'Bridge Router'], [u'shortened', u'for brevity']]
dict_ = {key.split(".")[1]: val for key, val in list_[:-1]}
这给了你
{'1': 'Te1/0/25',
'11': 'Bridge Router',
'12': 'Bridge Router',
'2': '1',
'3': 'MAC address',
'4': '00:zzzzzzz',
'5': 'MAC address',
'6': '00:zzzzzzzz',
'7': '120',
'8': 'Port 25',
'9': 'THE_HOST_NAME'}
从那里可以轻松制作您想要的词典
output = {
"l_id": list_[0][0].split(".", 2)[-1],
"l_ifname": dict_["1"],
"l_rname": dict_["8"],
"r_hostname": dict_["9"],
}
我想在 Check_MK 的清单插件中处理来自 TP-Link 交换机的 LLDP 数据。 TP-Link 交换机不使用 LLDP 的标准 SNMP OID,并且他们的自定义 MIB 有一个 weird 怪癖。他们没有将索引放在 OID 的末尾,而是放在 OID 的中间。
[[[u'1.1.99353.1', u'Te1/0/25'], [u'1.2.99353.1', u'1'], [u'1.3.99353.1', u'MAC address'], [u'1.4.99353.1', u'00:zzzzzzz'], [u'1.5.99353.1', u'MAC address'], [u'1.6.99353.1', u'00:zzzzzzzz'], [u'1.7.99353.1', u'120'], [u'1.8.99353.1', u'Port 25'], [u'1.9.99353.1', u'THE_HOST_NAME'], [u'1.11.99353.1', u'Bridge Router'], [u'1.12.99353.1', u'Bridge Router'], [u'shortened', u'for brevity']]
所以在正常行星上,我希望像 99353.8 和 99353.9 或者 99353.1.[=23= 这样的东西]8 和 99353.1.9。他们在这里 (1.X.99353.1) 所做的事情很奇怪。我不知道该怎么办。 我所知道的是我必须对其进行标准化,但我太笨了,做不到。
这就是我想用它做的:
{
l_id : 99353.1 # from the "index"
l_ifname : u'Te1/0/25' # from 1.1
r_ifname : u'Port 25' # from 1.8
r_hostname : u'THE_HOST_NAME' # from 1.9.
}
映射这个(只是列表的一个子集,同时拆分 key-to-be 完全超出了我的技能水平。我想避免花半天时间用一堆 for-循环。特别是因为这应该向上游到社区项目,我不希望任何人伤害他们的眼睛。
是否有一些聪明的方法可以让我将其分解为 2-3 个较小的问题?
您可以使用 string.split 对索引进行字典:
list_ = [[u'1.1.99353.1', u'Te1/0/25'], [u'1.2.99353.1', u'1'], [u'1.3.99353.1', u'MAC address'], [u'1.4.99353.1', u'00:zzzzzzz'], [u'1.5.99353.1', u'MAC address'], [u'1.6.99353.1', u'00:zzzzzzzz'], [u'1.7.99353.1', u'120'], [u'1.8.99353.1', u'Port 25'], [u'1.9.99353.1', u'THE_HOST_NAME'], [u'1.11.99353.1', u'Bridge Router'], [u'1.12.99353.1', u'Bridge Router'], [u'shortened', u'for brevity']]
dict_ = {key.split(".")[1]: val for key, val in list_[:-1]}
这给了你
{'1': 'Te1/0/25',
'11': 'Bridge Router',
'12': 'Bridge Router',
'2': '1',
'3': 'MAC address',
'4': '00:zzzzzzz',
'5': 'MAC address',
'6': '00:zzzzzzzz',
'7': '120',
'8': 'Port 25',
'9': 'THE_HOST_NAME'}
从那里可以轻松制作您想要的词典
output = {
"l_id": list_[0][0].split(".", 2)[-1],
"l_ifname": dict_["1"],
"l_rname": dict_["8"],
"r_hostname": dict_["9"],
}