我有以下内容,需要在某些事物之间建立父子关系。
例如,每当我在另一个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
答案 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
,但我看不出它的好处。