如何将这个基本列表变成更有条理的列表?

时间:2016-07-09 14:32:19

标签: python list loops

我有一个相当基本的列表如下:

listOne = [parentOneObject,childOne,childTwo,childThree,parentTwoObject,childOne,childTwo...]

从理论上讲,这个列表包含父母和他们旁边的孩子,每个iteml是这个列表是一个对象(实际上是一个HTML元素,但这不是问题)

变成了一个层次结构,我们得到了这个:

-ParentOne
  -Child1
  -Child2
  -Child3
-ParentTwo
  -Child1
  -Child2

等等......

为了区分父母,我检查他们的类属性是否包含:level-1。其他孩子的class属性为"level-i",其中i是一个大于1的整数。

我无法找到一种方法将该列表转换为更加结构化的dict列表,如下所示:

listTwo = [{
            'parent' : parentOne,
            'children': [childOne,childTwo,childThree]
            },
            {'parent':parentTwo,
             'children': [childOne,childTwo,childThree]
            }]

我想使用前面解释的逻辑将第一个基本列表转换为parnet和children对象的字典列表。

我知道我应该至少有一个最小代码,但是对于这个问题我完全陷入困境,我唯一的代码是:

for item in listOne:
   #Do something to turn list one into a structured list
   pass

你可以看到没什么用处,我很乐意得到一些帮助,不一定是python,因为我陷入了逻辑层面,甚至伪代码也没问题。

1 个答案:

答案 0 :(得分:2)

你需要有办法区分父母和孩子。然后你所要做的就是在循环中测试它:

listTwo = []
entry = None
for element in listOne:
    if isparent(element):  # put your test here
        entry = {'parent': element, 'children': []}
        listTwo.append(entry)
    else:  # it's a child, append to last parent
        entry['children'].append(element)

因此,如果您可以通过HTML类区分HTML元素,那么只需测试它:

if 'level-1' in element.get('class', []):  # it's a parent

请注意,如果listOne中的第一个元素不是父元素,entry['children']表达式将失败,因为entry仍设置为{{1在那个阶段。这是故意的,你想知道你是否有这样的错误。