创建父子项

时间:2019-05-27 12:30:55

标签: python

我有以下内容,需要在某些事物之间建立父子关系。

例如,每当我在另一个start中遇到start时,它就被视为较早的父级的孩子,因此在示例step3中是step2的孩子。

我已经打开文件并使用正则表达式。我正在尝试提取步骤 然后基于父子关系创建字典。

示例文字:

-----Starting Step for step1-----
text1
text2
text3
-----Ending Step for step1-----
-----Starting Step for step2-----
text4
text5
text6
-----Starting Step for step3-----
text7
text8
text9
-----Ending Step for step3-----

text10
text11
text12
-----Ending Step for step2-----

我的代码是:

with open('notepad_1.txt','r') as f1:
    for line in f1:
        value=re.findall(r'Starting Step for (\w+)',line)
        new_value=re.findall(r'Ending Step for (\w+)',line)
        if value:
            if parent_tag_start:
                parent_tag_start[-1][parent_tag_start[-1].keys()[0]]=value[0]  
            else:
                parent_tag_start.append(value[0])
        elif new_value:
            parent_tag_start.remove(new_value[0])

预期产量

{'step1':None,step2:{step3}} # could extend up to n levels

2 个答案:

答案 0 :(得分:0)

我认为您使问题过于复杂了。一个好主意是使用列表parten_tag_start来跟踪您已经“下降”的级别,但是使用它的方式太复杂了。

您只需在需要添加另一个级别时遍历parent_tag_start列表即可。我更新了您的代码,以在新创建的级别/孩子上添加一个空字典。因此,使用此代码:

import re

parent_tag_start = []
result_dict = {}

with open('notepad_1.txt', 'r') as f1:
    for line in f1:
        value = re.findall(r'Starting Step for (\w+)', line)
        new_value = re.findall(r'Ending Step for (\w+)', line)
        if value:
            level = result_dict
            # Find the current level
            for item in parent_tag_start:
                level = level[item]
            level[value[0]] = {}  # Add an empty dict as new child

            parent_tag_start.append(value[0])
        elif new_value:
            parent_tag_start.remove(new_value[0])  # A level ended

print(result_dict)

这将为您的示例文本生成以下输出:

{'step1': {}, 'step2': {'step3': {}}}

要检查另一个孩子,您可以简单地检查当前元素的值是否为空字典。

答案 1 :(得分:0)

您可以只使用stack列表来跟踪上一个活动词典。

由于字典是可变的,因此实际上无论您如何访问它,都在编辑相同的对象。所以如果你有

new = {}
out['a'] = new
stack[-1] = new

然后out['a']stack[-1]实际上是相同的元素,您可以通过调用两者之一对其进行编辑。

这是建议的代码:

import re

with open('notepad_1.txt','r') as f:
    out = {}
    stack = [out]
    for line in f.readlines():
        start=re.findall(r'Starting Step for (\w+)',line)
        end=re.findall(r'Ending Step for (\w+)',line)

        if start:
            new = dict()
            stack[-1][start[0]] = new
            # Add the new dict to the stack
            stack.append(new)
        elif end:
            # remove the last dict as it is completed
            stack.pop()      
print(out)

输出:

  

{'step1': {}, 'step2': {'step3': {}}}

抬头

如果文件结构无效且结尾标记太少,它将抛出IndexError

您仍然可以随后遍历结果并替换空字典。 {}None,但我看不出它的好处。