【问题标题】:How to merge values with same keys in a nested dictionary? (Nothing works)如何在嵌套字典中合并具有相同键的值? (没有任何效果)
【发布时间】:2020-12-16 19:34:12
【问题描述】:

首先我是 Python 编程的新手,因此非常感谢任何帮助。我在组合来自不同字典的相同键值时遇到问题,因此它是一个键值对。我尝试了这里提供的许多解决方案,但似乎都不适用于我的情况。我知道我做错了什么。输出来自解析两个单独的基于文本的配置。这一切都在同一个巨大的 masterDict 字典中结束。我可以更改它,以便每个文件生成一个单独的字典,但我希望它可以扩展到最多 4 个嵌套字典。 0 是第一个文件,1 是第二个文件。这是字典的摘要版本。

masterDict = {0: {'access': {'interface GigabitEthernet0/1': ' switchport access vlan 532'},
     'description': {'interface GigabitEthernet0/1': ' description Printer'},
     'duplex': {'interface GigabitEthernet0/1': ' duplex half'},
     'speed': {'interface GigabitEthernet0/1': ' speed 10'},
     'trunk': {'interface GigabitEthernet0/1': 'switchport mode trunk'}},
 1: {'access': {'interface GigabitEthernet0/2': ' switchport access vlan 532'},
     'description': {'interface GigabitEthernet0/2': ' description Printer'},
     'duplex': {'interface GigabitEthernet0/2': ' duplex half'},
     'speed': {'interface GigabitEthernet0/2': ' speed 10'},
     'trunk': {'interface GigabitEthernet0/2': 'switchport mode trunk'}}}

我希望最终结果如下所示:

newMasterDict = {0: {'interface GigabitEthernet0/1': [' switchport access vlan 532',
                                      ' description Printer',
                                      ' duplex half',
                                      ' speed 10',
                                      'switchport mode trunk']},
 1: {'newDict': {'interface GigabitEthernet0/2': [' switchport access vlan 532',
                                                  ' description Printer',
                                                  ' duplex half',
                                                  ' speed 10',
                                                  'switchport mode trunk']}}}

请注意,键不会出现在每个字典中。有人可以指出我正确的方向吗?非常感谢!

masterDict 的生成方式如下:

from ciscoconfparse import CiscoConfParse
from collections import defaultdict
homepath = 'c:/Users/c_eavila/Box/Projects/Environment1/'
pathList = ("testconfig.txt", "testconfig2.txt")
queryList = ('description', 'speed', 'duplex')
swpModes = ("access", "trunk")

masterDict = {}
masterDict2 = {}
for count, path in enumerate(pathList):
  dictList = {}
  loadParse = CiscoConfParse(config=homepath+path , ignore_blank_lines=True, syntax='ios')
  for mode in swpModes:
    if mode == "access":
      parentParse = loadParse.find_parents_w_child(r'^interface', r'switchport mode '+mode)
      accVlanParse = loadParse.find_children_w_parents(r'^interface', r'switchport access vlan')
      accVlanDict = dict(zip(parentParse, accVlanParse))
      dictList['access'] = accVlanDict
    elif mode == "trunk":
      v = 'switchport mode trunk'
      parentParse = loadParse.find_parents_w_child(r'^interface', r'switchport mode '+mode)
      trunkAllowedParse = loadParse.find_children_w_parents(r'^interface', r'switchport trunk allowed')
      if trunkAllowedParse != []:
        trunkAllowedDict = dict(zip(parentParse, trunkAllowedParse))
        trunkDict = dict(zip(parentParse, 'switchport mode trunk',))
        dictList['trunkallowed'] = trunkAllowedDict
        dictList['trunk'] = {k:v for k in trunkDict}
      elif trunkAllowedParse == []:
        trunkDict = dict(zip(parentParse, 'switchport mode trunk',))
        dictList['trunk'] = {k:v for k in trunkDict}
    for query in queryList:
      parentParse = loadParse.find_parents_w_child(r'^interface', query)
      childParse = loadParse.find_children_w_parents(r'^interface', query)
      dictList[query] = dict(zip(parentParse, childParse))
  masterDict[count] = dictList

这是配置的摘录。随意复制、粘贴并自己尝试一下。目标是只提取查询的行。

interface GigabitEthernet0/1
 switchport access vlan 532
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 auto qos voip cisco-phone 
 spanning-tree portfast
!
interface GigabitEthernet0/2
 switchport access vlan 532
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 auto qos voip cisco-phone 
 spanning-tree portfast
!
interface GigabitEthernet0/3
 description UPS
 switchport access vlan 15
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 auto qos voip cisco-phone 
 spanning-tree portfast
!
interface GigabitEthernet0/4
 switchport access vlan 532
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 auto qos voip cisco-phone 
 spanning-tree portfast
!
interface GigabitEthernet0/5
 description Office 207 port 226a Plotter
 switchport access vlan 50
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 speed 10
 duplex full
 auto qos voip cisco-phone 
 spanning-tree portfast
!
interface GigabitEthernet0/6
 switchport access vlan 532
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 auto qos voip cisco-phone 
 spanning-tree portfast
!
interface GigabitEthernet0/7
 description Printer Ray Rm 210
 switchport access vlan 50
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 auto qos voip cisco-phone 
 spanning-tree portfast
!
interface GigabitEthernet0/8
 switchport access vlan 532
 switchport mode access
 switchport voice vlan 45
 switchport port-security maximum 50
 switchport port-security
 switchport port-security aging time 5
 switchport port-security aging type inactivity
 auto qos voip cisco-phone 
 spanning-tree portfast

编辑:非常感谢@GhandiFloss 和@JoshuaSundance 的帮助。 @GhandiFloss 的解决方案似乎适用于我在上面发布的摘要字典。但是,它不适用于我的完整词典。我正在尝试调整代码以使其正常运行。同样,任何指向正确方向的点都将不胜感激! 这是完整的字典:请注意,它可能是从两个几乎相同的配置生成的字典的两倍。我希望最多能做 4 个。

masterDict = {0: {'access': {'interface GigabitEthernet0/1': ' switchport access vlan 532',
                'interface GigabitEthernet0/10': ' switchport access vlan 532',
                'interface GigabitEthernet0/11': ' switchport access vlan 532',
                'interface GigabitEthernet0/12': ' switchport access vlan 532',
                'interface GigabitEthernet0/13': ' switchport access vlan 50',
                'interface GigabitEthernet0/14': ' switchport access vlan 50',
                'interface GigabitEthernet0/15': ' switchport access vlan 532',
                'interface GigabitEthernet0/16': ' switchport access vlan 532',
                'interface GigabitEthernet0/17': ' switchport access vlan 532',
                'interface GigabitEthernet0/18': ' switchport access vlan 50',
                'interface GigabitEthernet0/19': ' switchport access vlan 532',
                'interface GigabitEthernet0/2': ' switchport access vlan 532',
                'interface GigabitEthernet0/20': ' switchport access vlan 50',
                'interface GigabitEthernet0/21': ' switchport access vlan 532',
                'interface GigabitEthernet0/22': ' switchport access vlan 532',
                'interface GigabitEthernet0/23': ' switchport access vlan 532',
                'interface GigabitEthernet0/24': ' switchport access vlan 598',
                'interface GigabitEthernet0/25': ' switchport access vlan 50',
                'interface GigabitEthernet0/26': ' switchport access vlan 64',
                'interface GigabitEthernet0/27': ' switchport access vlan 64',
                'interface GigabitEthernet0/28': ' switchport access vlan 64',
                'interface GigabitEthernet0/29': ' switchport access vlan 50',
                'interface GigabitEthernet0/3': ' switchport access vlan 15',
                'interface GigabitEthernet0/30': ' switchport access vlan 532',
                'interface GigabitEthernet0/31': ' switchport access vlan 50',
                'interface GigabitEthernet0/32': ' switchport access vlan 532',
                'interface GigabitEthernet0/33': ' switchport access vlan 532',
                'interface GigabitEthernet0/34': ' switchport access vlan 50',
                'interface GigabitEthernet0/35': ' switchport access vlan 50',
                'interface GigabitEthernet0/36': ' switchport access vlan 64',
                'interface GigabitEthernet0/37': ' switchport access vlan 64',
                'interface GigabitEthernet0/38': ' switchport access vlan 532',
                'interface GigabitEthernet0/39': ' switchport access vlan 532',
                'interface GigabitEthernet0/4': ' switchport access vlan 532',
                'interface GigabitEthernet0/40': ' switchport access vlan 50',
                'interface GigabitEthernet0/41': ' switchport access vlan 50',
                'interface GigabitEthernet0/42': ' switchport access vlan 50',
                'interface GigabitEthernet0/43': ' switchport access vlan 532',
                'interface GigabitEthernet0/44': ' switchport access vlan 50',
                'interface GigabitEthernet0/45': ' switchport access vlan 50',
                'interface GigabitEthernet0/46': ' switchport access vlan 532',
                'interface GigabitEthernet0/47': ' switchport access vlan 532',
                'interface GigabitEthernet0/48': ' switchport access vlan 532',
                'interface GigabitEthernet0/5': ' switchport access vlan 50',
                'interface GigabitEthernet0/6': ' switchport access vlan 532',
                'interface GigabitEthernet0/7': ' switchport access vlan 50',
                'interface GigabitEthernet0/8': ' switchport access vlan 532',
                'interface GigabitEthernet0/9': ' switchport access vlan 50'},
     'description': {'interface GigabitEthernet0/13': ' description Printer',
                     'interface GigabitEthernet0/14': ' description Printer '
                                                      '216',
                     'interface GigabitEthernet0/17': ' description bpdu '
                                                      '8-19-20 cp',
                     'interface GigabitEthernet0/18': ' description FMA 200A '
                                                      'Printer',
                     'interface GigabitEthernet0/20': ' description Printer '
                                                      '209',
                     'interface GigabitEthernet0/24': ' description Wireless',
                     'interface GigabitEthernet0/25': ' description Printer',
                     'interface GigabitEthernet0/26': ' description Camera',
                     'interface GigabitEthernet0/27': ' description Camera',
                     'interface GigabitEthernet0/28': ' description Camera',
                     'interface GigabitEthernet0/3': ' description UPS',
                     'interface GigabitEthernet0/35': ' description FMA '
                                                      'Printer 204',
                     'interface GigabitEthernet0/36': ' description Camera',
                     'interface GigabitEthernet0/37': ' description Camera',
                     'interface GigabitEthernet0/40': ' description Printer',
                     'interface GigabitEthernet0/41': ' description Printer',
                     'interface GigabitEthernet0/45': ' description Printer',
                     'interface GigabitEthernet0/5': ' description Office 207 '
                                                     'port 226a Plotter',
                     'interface GigabitEthernet0/51': ' description trunktest',
                     'interface GigabitEthernet0/7': ' description Printer Ray '
                                                     'Rm 210',
                     'interface GigabitEthernet0/9': ' description Printer 213',
                     'interface Vlan1000': ' description Management VLAN'},
     'duplex': {'interface GigabitEthernet0/36': ' duplex half',
                'interface GigabitEthernet0/5': ' duplex full',
                'interface GigabitEthernet0/51': ' duplex full'},
     'speed': {'interface GigabitEthernet0/36': ' speed 10',
               'interface GigabitEthernet0/5': ' speed 10',
               'interface GigabitEthernet0/51': ' speed 100'},
     'trunk': {'interface GigabitEthernet0/49': ' switchport mode trunk',
               'interface GigabitEthernet0/50': ' switchport mode trunk',
               'interface GigabitEthernet0/51': ' switchport mode trunk'},
     'trunkallowed': {'interface GigabitEthernet0/49': ' switchport trunk '
                                                       'allowed vlan 50'}},
 1: {'access': {'interface GigabitEthernet0/1': ' switchport access vlan 532',
                'interface GigabitEthernet0/10': ' switchport access vlan 532',
                'interface GigabitEthernet0/11': ' switchport access vlan 532',
                'interface GigabitEthernet0/12': ' switchport access vlan 532',
                'interface GigabitEthernet0/13': ' switchport access vlan 50',
                'interface GigabitEthernet0/14': ' switchport access vlan 50',
                'interface GigabitEthernet0/15': ' switchport access vlan 532',
                'interface GigabitEthernet0/16': ' switchport access vlan 532',
                'interface GigabitEthernet0/17': ' switchport access vlan 532',
                'interface GigabitEthernet0/18': ' switchport access vlan 50',
                'interface GigabitEthernet0/19': ' switchport access vlan 532',
                'interface GigabitEthernet0/2': ' switchport access vlan 532',
                'interface GigabitEthernet0/20': ' switchport access vlan 50',
                'interface GigabitEthernet0/21': ' switchport access vlan 532',
                'interface GigabitEthernet0/22': ' switchport access vlan 532',
                'interface GigabitEthernet0/23': ' switchport access vlan 532',
                'interface GigabitEthernet0/24': ' switchport access vlan 598',
                'interface GigabitEthernet0/25': ' switchport access vlan 50',
                'interface GigabitEthernet0/26': ' switchport access vlan 64',
                'interface GigabitEthernet0/27': ' switchport access vlan 64',
                'interface GigabitEthernet0/28': ' switchport access vlan 64',
                'interface GigabitEthernet0/29': ' switchport access vlan 50',
                'interface GigabitEthernet0/3': ' switchport access vlan 15',
                'interface GigabitEthernet0/30': ' switchport access vlan 532',
                'interface GigabitEthernet0/31': ' switchport access vlan 50',
                'interface GigabitEthernet0/32': ' switchport access vlan 532',
                'interface GigabitEthernet0/33': ' switchport access vlan 532',
                'interface GigabitEthernet0/34': ' switchport access vlan 50',
                'interface GigabitEthernet0/35': ' switchport access vlan 50',
                'interface GigabitEthernet0/36': ' switchport access vlan 64',
                'interface GigabitEthernet0/37': ' switchport access vlan 64',
                'interface GigabitEthernet0/38': ' switchport access vlan 532',
                'interface GigabitEthernet0/39': ' switchport access vlan 532',
                'interface GigabitEthernet0/4': ' switchport access vlan 532',
                'interface GigabitEthernet0/40': ' switchport access vlan 50',
                'interface GigabitEthernet0/41': ' switchport access vlan 50',
                'interface GigabitEthernet0/42': ' switchport access vlan 50',
                'interface GigabitEthernet0/43': ' switchport access vlan 532',
                'interface GigabitEthernet0/44': ' switchport access vlan 50',
                'interface GigabitEthernet0/45': ' switchport access vlan 50',
                'interface GigabitEthernet0/46': ' switchport access vlan 532',
                'interface GigabitEthernet0/47': ' switchport access vlan 532',
                'interface GigabitEthernet0/48': ' switchport access vlan 532',
                'interface GigabitEthernet0/5': ' switchport access vlan 50',
                'interface GigabitEthernet0/6': ' switchport access vlan 532',
                'interface GigabitEthernet0/7': ' switchport access vlan 50',
                'interface GigabitEthernet0/8': ' switchport access vlan 532',
                'interface GigabitEthernet0/9': ' switchport access vlan 50'},
     'description': {'interface GigabitEthernet0/13': ' description Printer',
                     'interface GigabitEthernet0/14': ' description Printer '
                                                      '216',
                     'interface GigabitEthernet0/17': ' description bpdu '
                                                      '8-19-20 cp',
                     'interface GigabitEthernet0/18': ' description FMA 200A '
                                                      'Printer',
                     'interface GigabitEthernet0/20': ' description Printer '
                                                      '209',
                     'interface GigabitEthernet0/24': ' description Wireless',
                     'interface GigabitEthernet0/25': ' description Printer',
                     'interface GigabitEthernet0/26': ' description Camera',
                     'interface GigabitEthernet0/27': ' description Camera',
                     'interface GigabitEthernet0/28': ' description Camera',
                     'interface GigabitEthernet0/3': ' description UPS',
                     'interface GigabitEthernet0/35': ' description FMA '
                                                      'Printer 204',
                     'interface GigabitEthernet0/36': ' description Camera',
                     'interface GigabitEthernet0/37': ' description Camera',
                     'interface GigabitEthernet0/40': ' description Printer',
                     'interface GigabitEthernet0/41': ' description Printer',
                     'interface GigabitEthernet0/45': ' description Printer',
                     'interface GigabitEthernet0/5': ' description Office 207 '
                                                     'port 226a Plotter',
                     'interface GigabitEthernet0/51': ' description trunktest',
                     'interface GigabitEthernet0/7': ' description Printer Ray '
                                                     'Rm 210',
                     'interface GigabitEthernet0/9': ' description Printer 213',
                     'interface Vlan1000': ' description Management VLAN'},
     'duplex': {'interface GigabitEthernet0/36': ' duplex half',
                'interface GigabitEthernet0/5': ' duplex full',
                'interface GigabitEthernet0/51': ' duplex full'},
     'speed': {'interface GigabitEthernet0/36': ' speed 10',
               'interface GigabitEthernet0/5': ' speed 10',
               'interface GigabitEthernet0/51': ' speed 100'},
     'trunk': {'interface GigabitEthernet0/49': ' switchport mode trunk',
               'interface GigabitEthernet0/50': ' switchport mode trunk',
               'interface GigabitEthernet0/51': ' switchport mode trunk'}}}

【问题讨论】:

  • 你能说明最初的 masterDict 是如何生成的吗?
  • 刚刚编辑了我的帖子。如果有不清楚的地方,请告诉我。谢谢!

标签: python dictionary parsing merge key


【解决方案1】:

这适用于您发布的大量字典。正如我所说,它一团糟,需要一些工作,但它应该有所帮助。这花了我一段时间,但它让我很烦所以想完成它!

def seperate_dicts(dicts):
  dict_list = []
  keys = list(dicts.keys())
  for key in keys:
    new_dict = {}
    new_dict[key] = dicts[key]
    dict_list.append(new_dict)
    new_dict = {}
  return dict_list


def get_attribs(dict_list):
  new_main = {}
  key = list(dict_list[0].keys())[0]
  new_main['newDict'] = dict_list[0][key]
  for i in range(1, len(dict_list)):
    other_key = list(dict_list[i].keys())[0]
    other_keys = list(dict_list[i][other_key])
    for key2 in other_keys:
      if key2 not in new_main['newDict']:
        new_main['newDict'][key2] = dict_list[i][other_key][key2]
      elif isinstance(new_main['newDict'][key2], list):
        new_main['newDict'][key2].append(dict_list[i][other_key][key2])
      else:
        new_main['newDict'][key2] = [
            new_main['newDict'][key2], dict_list[i][other_key][key2]]
  return new_main

new_master = {}

for i in range(len(masterDict)):
  dict_list = seperate_dicts(masterDict[i])
  res = get_attribs(dict_list)
  new_master[i] = res

print(new_master)

【讨论】:

  • 您好,这适用于一个新文件!但是,在我生成的 masterDict 上,它不起作用。它引发以下错误。回溯(最后一次调用):文件“c:/Users/c_eavila/Box/Projects/Environment1/cisco_conf_parse_test.py”,第 46 行,在 listofattribs.append(inner_dict[key][inner_key]) KeyError: '接口 GigabitEthernet0/1'
  • 它可能会挂断从 0/1 到 0/2 的密钥增量尝试我的编辑
  • 同样的错误:(。我的字典肯定是错误的。试图看看我如何正确生成它。
  • 你好。我尝试复制和粘贴我生成的字典,它仍然是同样的错误。我刚刚意识到这是因为它不能在我生成的字典上工作,因为它有更多的内部键。我将如何重写您的代码,以便它可以遍历我内部字典中的所有键?谢谢!
  • 好的,我想我可能有一个解决方案,我花了一段时间,代码很乱,需要重构,但它会给你一些东西。我现在要编辑。
【解决方案2】:

(编辑):在审查了您的 cmets 并更多地考虑了您的需求之后,更像这样的东西呢?

# ls will be a list of dicts where each dict represents an interface
ls = []

# testconf is the configuration file from your question
# split it into chunks seperated by the exclamation points
for i in testconf.split('!'):
    d = {}
    # split each chunk into lines
    for l in i.split('\n'):
        l = l.strip()
        if l != '':
            for s in ['interface', 'switchport mode', 'description', 'speed', 'duplex']:
                # if the line starts with the word
                if l.startswith(s):
                    # if the word is already in d
                    if s in d.keys():
                        # if it's not a list
                        if not type(d[s])==list:
                            d[s] = [d[s], l.replace(s,'').strip()]
                        else:
                        # if it is a list
                            d[s].append(l.replace(s,'').strip())
                    # if the word is not already in d
                    else:
                            d[s] = l.replace(s,'').strip()
    # add d to ls
    ls.append(d)
    
access = [d for d in ls if 'access' in list(d.values())]
trunk = [d for d in ls if 'trunk' in list(d.values())]

print(trunk)
print('\n\n\n')
print(access)

输出:

[{'interface': 'GigabitEthernet0/49', 'switchport mode': 'trunk'},
 {'interface': 'GigabitEthernet0/50', 'switchport mode': 'trunk'},
 {'description': 'trunktest',
  'duplex': 'full',
  'interface': 'GigabitEthernet0/51',
  'speed': '100',
  'switchport mode': 'trunk'}]




[{'interface': 'GigabitEthernet0/1', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/2', 'switchport mode': 'access'},
 {'description': 'UPS',
  'interface': 'GigabitEthernet0/3',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/4', 'switchport mode': 'access'},
 {'description': 'Office 207 port 226a Plotter',
  'duplex': 'full',
  'interface': 'GigabitEthernet0/5',
  'speed': '10',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/6', 'switchport mode': 'access'},
 {'description': 'Printer Ray Rm 210',
  'interface': 'GigabitEthernet0/7',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/8', 'switchport mode': 'access'},
 {'description': 'Printer 213',
  'interface': 'GigabitEthernet0/9',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/10', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/11', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/12', 'switchport mode': 'access'},
 {'description': 'Printer',
  'interface': 'GigabitEthernet0/13',
  'switchport mode': 'access'},
 {'description': 'Printer 216',
  'interface': 'GigabitEthernet0/14',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/15', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/16', 'switchport mode': 'access'},
 {'description': 'bpdu 8-19-20 cp',
  'interface': 'GigabitEthernet0/17',
  'switchport mode': 'access'},
 {'description': 'FMA 200A Printer',
  'interface': 'GigabitEthernet0/18',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/19', 'switchport mode': 'access'},
 {'description': 'Printer 209',
  'interface': 'GigabitEthernet0/20',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/21', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/22', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/23', 'switchport mode': 'access'},
 {'description': 'Wireless',
  'interface': 'GigabitEthernet0/24',
  'switchport mode': 'access'},
 {'description': 'Printer',
  'interface': 'GigabitEthernet0/25',
  'switchport mode': 'access'},
 {'description': 'Camera',
  'interface': 'GigabitEthernet0/26',
  'switchport mode': 'access'},
 {'description': 'Camera',
  'interface': 'GigabitEthernet0/27',
  'switchport mode': 'access'},
 {'description': 'Camera',
  'interface': 'GigabitEthernet0/28',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/29', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/30', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/31', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/32', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/33', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/34', 'switchport mode': 'access'},
 {'description': 'FMA Printer 204',
  'interface': 'GigabitEthernet0/35',
  'switchport mode': 'access'},
 {'description': 'Camera',
  'duplex': 'half',
  'interface': 'GigabitEthernet0/36',
  'speed': '10',
  'switchport mode': 'access'},
 {'description': 'Camera',
  'interface': 'GigabitEthernet0/37',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/38', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/39', 'switchport mode': 'access'},
 {'description': 'Printer',
  'interface': 'GigabitEthernet0/40',
  'switchport mode': 'access'},
 {'description': 'Printer',
  'interface': 'GigabitEthernet0/41',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/42', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/43', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/44', 'switchport mode': 'access'},
 {'description': 'Printer',
  'interface': 'GigabitEthernet0/45',
  'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/46', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/47', 'switchport mode': 'access'},
 {'interface': 'GigabitEthernet0/48', 'switchport mode': 'access'}]

(旧帖子):我不确定您到底想要什么,因为您想要的最终结果包含语法错误。以这样的方式作为起点怎么样?

def newd(d):
    nk = list(list(d.values())[0].keys())[0]
    nd = {}
    nd['interface'] = nk.replace('interface ','').strip()
    for k,v in d.items():
        nd[k] = v[nk].replace(k,'').strip()
    return nd

{k:newd(v) for k,v in masterDict.items()}

输出:

{0: {'access': 'switchport  vlan 532',
     'description': 'Printer',
     'duplex': 'half',
     'interface': 'GigabitEthernet0/1',
     'speed': '10',
     'trunk': 'switchport mode'},
 1: {'access': 'switchport  vlan 532',
     'description': 'Printer',
     'duplex': 'half',
     'interface': 'GigabitEthernet0/2',
     'speed': '10',
     'trunk': 'switchport mode'}}

【讨论】:

  • 我的字典生成中肯定存在语法错误。我目前正在查看如何解决它。看来我生成的字典是问题所在。
  • 另外,我在你的代码上得到了同样的 KeyError。回溯(最后一次调用):文件“c:/Users/c_eavila/Box/Projects/Environment1/cisco_conf_parse_test.py”,第 48 行,在 {k:newd(v) for k,v in masterDict.items ()} 文件“c:/Users/c_eavila/Box/Projects/Environment1/cisco_conf_parse_test.py”,第 48 行,在 {k:newd(v) for k,v in masterDict.items()} 文件“ c:/Users/c_eavila/Box/Projects/Environment1/cisco_conf_parse_test.py",第 45 行,在 newd nd[k] = v[nk].replace(k,'').strip() KeyError: 'interface GigabitEthernet0/ 1'
  • 我刚刚意识到我的输出字典的功能就像一个列表,而不是一个字典,哈哈。不过要澄清一下,我的代码在您帖子顶部定义的 masterDict 上运行良好。 print(newmasterDict[0]){'interface': 'GigabitEthernet0/1', 'access': 'switchport vlan 532', 'description': 'Printer', 'duplex': 'half', 'speed': '10', 'trunk': 'switchport mode'}
  • 确实如此!我正在生成我的字典错误。我从字面上复制并粘贴了格式。然而,它的编码方式似乎存在一个潜在的问题。当我使用其他解决方案进行合并时,在说它是错误的数据类型之前,我确实遇到了不断的错误。虽然不确定
  • 也许我们应该从你拥有的(即 conf 文件?)和你需要的(即你希望你的 dict 结构如何)重新开始
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2018-08-02
  • 2023-03-02
  • 1970-01-01
相关资源
最近更新 更多