Python 将列表或元组作为值附加到字典或其他解决方案以构建父子关系

Python 将列表或元组作为值附加到字典或其他解决方案以构建父子关系,python,list,dictionary,tuples,ipython,Python,List,Dictionary,Tuples,Ipython,我从Wordpress数据库中检索到以下菜单项元组及其层次结构。 第一个值是菜单项的名称,第二个值是项id,第三个值是父项id。 如果父元素id为0,则它是顶级元素 ('Contact', 72, 0) ('Impressumm', 74, 0) ('Login', 227, 0) ('Company', 65, 0) ('References', 83, 65) ('AboutUs', 85, 65) ('Press', 87, 65) ('Solutions', 76, 0) ('Produ

我从Wordpress数据库中检索到以下菜单项元组及其层次结构。 第一个值是菜单项的名称,第二个值是项id,第三个值是父项id。 如果父元素id为0,则它是顶级元素

('Contact', 72, 0)
('Impressumm', 74, 0)
('Login', 227, 0)
('Company', 65, 0)
('References', 83, 65)
('AboutUs', 85, 65)
('Press', 87, 65)
('Solutions', 76, 0)
('ProductA', 242, 76)
('TechnologyA', 316, 242)
('Programming', 318, 242)
('Soldering', 321, 242)
('Welding', 323, 242)
('ProductB', 245, 76)
('Features', 326, 245)
('CADimport', 328, 245)
('Measuring', 331, 245)
('Surfaces', 333, 245)
('Editor', 248, 76)
('Simulation', 251, 76)
('Postprocessing', 254, 76)
('Manufacturing', 79, 0)
('Parts', 257, 79)
('Date', 259, 79)
('Tools', 261, 79)
('Communication', 263, 79)
('WebApps', 296, 79)
('Services', 69, 0)
('Training', 287, 69)
('Support', 285, 69)
('Forum', 289, 69)
('Events', 187, 0)
('Education', 269, 187)
('Workshops', 272, 187)
('Fairs', 275, 187)
('Seminars', 281, 187)
('Meetings', 278, 187)
对于元组数组中的每个元组,我想添加完整的层次结构。 例如

这里唯一的键是item_id(第二个元素)。名称可能重复出现或多次出现

我的想法是,这可以通过使用iPython的字典来实现。由于项id可能出现在元组列表中(例如,作为父项id),因此在定义它们之前,必须至少遍历数组一次

谁能给我一些开始的想法,如何

  • 在数组中迭代一次并构建字典

  • 第二,按项_id(递归地?)浏览字典以 查找父\u id并将名称附加到第二个值, 我们称之为层次结构


  • 创建递归查找项目父级的函数:

    def getHierarchy(item_id,array_of_tuple,separator="/"):
    
      for i, (tuple_name, tuple_id, tuple_parent_id) in enumerate(array_of_tuple):
          if item_id == tuple_id:
              if tuple_parent_id == 0:
                  return separator+tuple_name
              else:
                  return separator+tuple_name+getHierarchy(tuple_parent_id,array_of_tuple)
      return ""
    
    它产生:

    >>print getHierarchy(289,array_of_tuples)
    
    >>/Forum/Services
    

    这很好。我让它工作了。关于顺序和您的示例中缺少的一些参数的细微更正:枚举(映射)中的def getHierarchy(item_id,数组_of_tuple,separator=“/”):for i,(tuple_name,tuple_id,tuple_parent_id):if item\u id==tuple\u id:if tuple\u parent\u id==0:返回分隔符+tuple\u name else:返回getHierarchy(tuple\u parent\u id,数组\u of tuple,separator)+分隔符+tuple\u name return“”,表示映射中的名称、item\u id、父\u id:print getHierarchy(item\u id,map,“/”)@Krischu调用函数时不需要指定分隔符,因为它有一个默认值。也可以简化一点:对于map:print getHierarchy(item\u id,map,“/”)中的name、item\u id、parent\u id
    >>print getHierarchy(289,array_of_tuples)
    
    >>/Forum/Services