我有一个层次结构/树,我转换为列表呈现(级别,项目)。 我需要创建一个循环,它将在表示树级别的项目的字典中创建字典,这可以适用于具有不同级别项目的其他树。
转储树结构:
(0, 'Job=XYZ')
(1, 'Input Options Display')
(1, 'Abend S=0C7 (DEMO)')
(2, 'Abending Statement')
(3, 'Procedure DEMO')
(4, 'Variables')
(3, 'Storage')
(2, 'Program DEMO2')
(3, 'Storage')
(1, 'Execution Summary')
预期字典如下:
{Job=XYZ: 'Input Options Display', 'Abend S=0C7 (DEMO)':{'Abending Statement': 'Procedure DEMO' ... # and so on
答案 0 :(得分:0)
我无法弄清楚如何使用字典作为分层数据,但我想出了一个分层列表:
src = [(0, 'Job=XYZ'),
(1, 'Input Options Display'),
(1, 'Abend S=0C7 (DEMO)'),
(2, 'Abending Statement'),
(3, 'Procedure DEMO'),
(4, 'Variables'),
(3, 'Storage'),
(2, 'Program DEMO2'),
(3, 'Storage'),
(1, 'Execution Summary') ]
print(src)
top = []
current = top
current_level = 0
next = None
stack = [current]
for level,item in src:
if level is not current_level:
while len(stack) <= level:
stack.append(None)
if level > current_level:
stack[current_level] = current
current = next
if level < current_level:
current = stack[level]
next = []
current.append((item,next))
current_level = level
print(top)
输出:
[(0, 'Job=XYZ'), (1, 'Input Options Display'), (1, 'Abend S=0C7 (DEMO)'), (2, 'Abending Statement'), (3, 'Procedure DEMO'), (4, 'Variables'), (3, 'Storage'), (2, 'Program DEMO2'), (3, 'Storage'), (1, 'Execution Summary')]
[('Job=XYZ', [('Input Options Display', []), ('Abend S=0C7 (DEMO)', [('Abending Statement', [('Procedure DEMO', [('Variables', [])]), ('Storage', [])]), ('Program DEMO2', [('Storage', [])])]), ('Execution Summary', [])])]
src
是您原始数据转换为元组列表。
输出显示第一个src
,然后显示转换后的数据。
输出数据结构是元组列表,其中每个元组是源和子列表中的字符串。每个子列表当然是具有相同格式的元组列表。 (空子列表表示叶子项目。)
答案 1 :(得分:0)
这里有一个以字典作为输出的例子,但结构非常复杂:
ch<-c(5,7,10,5)
C<-150
s<-c(1,1,1,1); s
cost<-sum(ch*s)
repeat
{
for(i in 1:24)
{
for (j in 1:4)
{
if (pos[i,1]==j) s[j]<-s[j]+1 else s
}
if (cost<C)
{
break
}
}
}
s
输出格式如下:
输出:
# the input list
my_list = [(0, 'Job=XY2'),
(1, 'Input Options Display'),
(1, 'Abend S=0C7 (DEMO)'),
(2, 'Abending Statement'),
(3, 'Procedure DEMO'),
(4, 'Variables'),
(3, 'Storage'),
(2, 'Program DEMO2'),
(3, 'Storage'),
(1, 'Execution Summary')]
def return_dict(key, current_level, l):
d = {}
d[key] = []
for i, (level, element) in enumerate(l):
if level == current_level+1 and i+1 < len(l):
# not the last one
if l[i+1][0] == level+1:
# deeper level exist
d[key].append(return_dict(element, level, l[i+1:]))
else:
if element not in d[key]:
d[key].append(element)
else:
# last one
if level == current_level+1:
d[key].append(element)
return d
result = return_dict(my_list[0][1], my_list[0][0], my_list[1:])
print(result)
你可以看一级,它是一个包含3个元素的列表,其中第一个和最后一个元素是字符串,第二个元素是字典。
{'Job=XY2': ['Input Options Display', {'Abend S=0C7 (DEMO)': [{'Abending Statement': [{'Procedure DEMO': ['Variables']}, 'Storage']}, {'Program DEMO2': ['Storage']}]}, 'Execution Summary']}
如果你分解了1级的字典元素2,你会得到他的结构,一个带有2个元素列表作为值的字典,包含字典:
{'Job=XY2':
[
'Input Options Display',
{'Abend S=0C7 (DEMO)': [{'Abending Statement': [{'Procedure DEMO': ['Variables']}, 'Storage']}, {'Program DEMO2': ['Storage']}]},
'Execution Summary'
]
}
进一步打破这个级别,你得到这个结构:
{'Abend S=0C7 (DEMO)':
[
{'Abending Statement': [{'Procedure DEMO': ['Variables']}, 'Storage']},
{'Program DEMO2': ['Storage']}
]
}
要检索任何值:
示例,获取“Procedure DEMO”值:
{'Abending Statement':
[
{'Procedure DEMO': ['Variables']},
'Storage'
]
}
{'Program DEMO2':
['Storage']
}
输出:
value = result['Job=XY2'][1]['Abend S=0C7 (DEMO)'][0]['Abending Statement'][0]['Procedure DEMO'][0]
print(value)