在python中将空格分隔的树转换为有用的dict

在python中将空格分隔的树转换为有用的dict,python,whitespace,Python,Whitespace,我有一个项目输出(列表),如: Root Branch1 LeafA LeafB Branch2 LeafC LeafZ LeafD 它们都是由两个空格分隔的。 我想构建这个列表的逻辑表示,不带前导空格,并保留父子关系hiop 最后可能的结果是: aDict = { 'Root': null, 'Branch1': 'Root', 'LeafA': 'Branch1', ... so on and so forth }

我有一个项目输出(列表),如:

Root
  Branch1
    LeafA
    LeafB
  Branch2
    LeafC
      LeafZ
    LeafD
它们都是由两个空格分隔的。 我想构建这个列表的逻辑表示,不带前导空格,并保留父子关系hiop

最后可能的结果是:

aDict = {
    'Root': null,
    'Branch1': 'Root',
    'LeafA': 'Branch1',
... so on and so forth
}
最后,我希望遍历字典并检索键和父项,以及基于键的另一个dict中的另一个值。

尝试以下操作:

tree = """Root
  Branch1
    LeafA
    LeafB
  Branch2
    LeafC
      LeafZ
    LeafD"""

aDict = {}
iDict = {}
for line in tree.split("\n"):
    key = line.lstrip(" ")
    indent = (len(line) - len(key)) / 2
    if indent == 0:
        aDict[key] = None
    else:
        aDict[key] = iDict[indent - 1]
    iDict[indent] = key

print aDict
# {'LeafD': 'Branch2', 'LeafA': 'Branch1', 'Branch2': 'Root', 'LeafC': 'Branch2', 'LeafB': 'Branch1', 'Branch1': 'Root', 'Root': None, 'LeafZ': 'LeafC'}
试试这个:

tree = """Root
  Branch1
    LeafA
    LeafB
  Branch2
    LeafC
      LeafZ
    LeafD"""

aDict = {}
iDict = {}
for line in tree.split("\n"):
    key = line.lstrip(" ")
    indent = (len(line) - len(key)) / 2
    if indent == 0:
        aDict[key] = None
    else:
        aDict[key] = iDict[indent - 1]
    iDict[indent] = key

print aDict
# {'LeafD': 'Branch2', 'LeafA': 'Branch1', 'Branch2': 'Root', 'LeafC': 'Branch2', 'LeafB': 'Branch1', 'Branch1': 'Root', 'Root': None, 'LeafZ': 'LeafC'}

我想这就解决了问题:

#!/usr/bin/env python def f(txt): stack = [] ret = {} for line in txt.split('\n'): a = line.split(' ') level = len(a) - 1 key = a[-1] stack = stack[:level] ret[key] = stack[-1] if len(stack) > 0 else None stack.append(key) return ret print f("""Root Branch1 LeafA LeafB Branch2 LeafC LeafZ LeafD""") print f("""Root1 Branch1 LeafA LeftZ Branch2 LeftB Root2 Branch3""") #!/usr/bin/env python def f(txt): 堆栈=[] ret={} 对于txt.split('\n')中的行: a=行分割(“”) 级别=透镜(a)-1 键=a[-1] 堆栈=堆栈[:级别] ret[key]=如果len(stack)>0,则堆栈[-1],否则无 stack.append(键) 回程网 打印f(““”根 Branch1 叶 利弗布 分支2 利弗克 利弗兹 (以“”号填列) 打印f(““”根1 Branch1 叶 左撇子 分支2 左B 根2 (第3节“”) 输出:

{'LeafD': 'Branch2', 'LeafA': 'Branch1', 'Branch2': 'Root', 'LeafC': 'Branch2', 'LeafB': 'Branch1', 'Branch1': 'Root', 'Root': None, 'LeafZ': 'LeafC'} {'LeafA': 'Branch1', 'Branch2': 'Root1', 'Branch1': 'Root1', 'LeftZ': 'LeafA', 'LeftB': 'Branch2', 'Branch3': 'Root2', 'Root1': None, 'Root2': None} {'LeafD':'Branch2','LeafA':'Branch1','Branch2':'Root','leafcc':'Branch2','LeafB':'Branch1','Branch1':'Root','Root':无,'LeafZ':'leafcc'} {'LeafA':'Branch1','Branch2':'Root1','Branch1':'Root1','LeftZ':'LeafA','LeftB':'Branch2','Branch3':'Root2','Root1':无,'Root2':无}
我想这就解决了问题:

#!/usr/bin/env python def f(txt): stack = [] ret = {} for line in txt.split('\n'): a = line.split(' ') level = len(a) - 1 key = a[-1] stack = stack[:level] ret[key] = stack[-1] if len(stack) > 0 else None stack.append(key) return ret print f("""Root Branch1 LeafA LeafB Branch2 LeafC LeafZ LeafD""") print f("""Root1 Branch1 LeafA LeftZ Branch2 LeftB Root2 Branch3""") #!/usr/bin/env python def f(txt): 堆栈=[] ret={} 对于txt.split('\n')中的行: a=行分割(“”) 级别=透镜(a)-1 键=a[-1] 堆栈=堆栈[:级别] ret[key]=如果len(stack)>0,则堆栈[-1],否则无 stack.append(键) 回程网 打印f(““”根 Branch1 叶 利弗布 分支2 利弗克 利弗兹 (以“”号填列) 打印f(““”根1 Branch1 叶 左撇子 分支2 左B 根2 (第3节“”) 输出:

{'LeafD': 'Branch2', 'LeafA': 'Branch1', 'Branch2': 'Root', 'LeafC': 'Branch2', 'LeafB': 'Branch1', 'Branch1': 'Root', 'Root': None, 'LeafZ': 'LeafC'} {'LeafA': 'Branch1', 'Branch2': 'Root1', 'Branch1': 'Root1', 'LeftZ': 'LeafA', 'LeftB': 'Branch2', 'Branch3': 'Root2', 'Root1': None, 'Root2': None} {'LeafD':'Branch2','LeafA':'Branch1','Branch2':'Root','leafcc':'Branch2','LeafB':'Branch1','Branch1':'Root','Root':无,'LeafZ':'leafcc'} {'LeafA':'Branch1','Branch2':'Root1','Branch1':'Root1','LeftZ':'LeafA','LeftB':'Branch2','Branch3':'Root2','Root1':无,'Root2':无}
您可能的最终结果无效。想修改吗?您可能的最终结果无效。要不要修改一下?