转储树列表项的Python字典

时间:2018-04-23 08:13:16

标签: python-3.x dictionary tree

我有一个层次结构/树,我转换为列表呈现(级别,项目)。 我需要创建一个循环,它将在表示树级别的项目的字典中创建字典,这可以适用于具有不同级别项目的其他树。

转储树结构:

(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

2 个答案:

答案 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

输出格式如下:

  • (1)字典,值始终是一个列表
  • (2)列表有两种类型的元素
    • (a)如果不存在子级别,则为字符串值
    • (b)字典如果存在子级别,并且该字典符合规则(1)

输出:

# 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']}
    ]
}

要检索任何值:

  • (1)调用顶级键,结果列表
  • (2)枚举列表或索引列表
    • (a)如果list的元素是string,那么这就是值
    • (b)如果元素是字典,则重复(1)

示例,获取“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)