gpt4 book ai didi

python - 从 python 中的缩进文本文件创建树/深度嵌套字典

转载 作者:太空狗 更新时间:2023-10-29 18:30:44 24 4
gpt4 key购买 nike

基本上,我想遍历一个文件并将每一行的内容放入一个深度嵌套的 dict 中,其结构由每行开头的空白数量定义。

本质上,目标是采取这样的事情:

a
b
c
d
e

然后把它变成这样:

{"a":{"b":"c","d":"e"}}

或者这个:

apple
colours
red
yellow
green
type
granny smith
price
0.10

进入这个:

{"apple":{"colours":["red","yellow","green"],"type":"granny smith","price":0.10}

这样我就可以将它发送到 Python 的 JSON 模块并生成一些 JSON。

目前我正在尝试按照这样的步骤制作字典和列表:

  1. {"a":""} ["a"]
  2. {"a":"b"} ["a"]
  3. {"a":{"b":"c"}} ["a","b"]
  4. {"a":{"b":{"c":"d"}}}} ["a","b","c"]
  5. {"a":{"b":{"c":"d"},"e":""}} ["a","e"]
  6. {"a":{"b":{"c":"d"},"e":"f"}} ["a","e"]<
  7. {"a":{"b":{"c":"d"},"e":{"f":"g"}}} ["a","e", “f”]

等等

列表就像“面包屑”一样显示我最后一次放入字典的位置。

为此,我需要一种方法来遍历列表并生成类似 dict["a"]["e"]["f"] 的内容以获取最后一个字典。我看过有人制作的 AutoVivification 类,它看起来非常有用,但我真的不确定:

  1. 我是否为此使用了正确的数据结构(我打算将其发送到 JSON 库以创建 JSON 对象)
  2. 如何在这种情况下使用 AutoVivification
  3. 一般来说是否有更好的方法来解决这个问题。

我想出了以下功能,但它不起作用:

def get_nested(dict,array,i):
if i != None:
i += 1
if array[i] in dict:
return get_nested(dict[array[i]],array)
else:
return dict
else:
i = 0
return get_nested(dict[array[i]],array)

非常感谢帮助!

(我剩下的极其不完整的代码在这里:)

#Import relevant libraries
import codecs
import sys

#Functions
def stripped(str):
if tab_spaced:
return str.lstrip('\t').rstrip('\n\r')
else:
return str.lstrip().rstrip('\n\r')

def current_ws():
if whitespacing == 0 or not tab_spaced:
return len(line) - len(line.lstrip())
if tab_spaced:
return len(line) - len(line.lstrip('\t\n\r'))

def get_nested(adict,anarray,i):
if i != None:
i += 1
if anarray[i] in adict:
return get_nested(adict[anarray[i]],anarray)
else:
return adict
else:
i = 0
return get_nested(adict[anarray[i]],anarray)

#initialise variables
jsondict = {}
unclosed_tags = []
debug = []

vividfilename = 'simple.vivid'
# vividfilename = sys.argv[1]
if len(sys.argv)>2:
jsfilename = sys.argv[2]
else:
jsfilename = vividfilename.split('.')[0] + '.json'

whitespacing = 0
whitespace_array = [0,0]
tab_spaced = False

#open the file
with codecs.open(vividfilename,'rU', "utf-8-sig") as vividfile:
for line in vividfile:
#work out how many whitespaces at start
whitespace_array.append(current_ws())

#For first line with whitespace, work out the whitespacing (eg tab vs 4-space)
if whitespacing == 0 and whitespace_array[-1] > 0:
whitespacing = whitespace_array[-1]
if line[0] == '\t':
tab_spaced = True

#strip out whitespace at start and end
stripped_line = stripped(line)

if whitespace_array[-1] == 0:
jsondict[stripped_line] = ""
unclosed_tags.append(stripped_line)

if whitespace_array[-2] < whitespace_array[-1]:
oldnested = get_nested(jsondict,whitespace_array,None)
print oldnested
# jsondict.pop(unclosed_tags[-1])
# jsondict[unclosed_tags[-1]]={stripped_line:""}
# unclosed_tags.append(stripped_line)

print jsondict
print unclosed_tags

print jsondict
print unclosed_tags

最佳答案

这是一种基于嵌套 Node 对象的复合结构的面向对象方法。

输入:

indented_text = \
"""
apple
colours
red
yellow
green
type
granny smith
price
0.10
"""

一个节点类

class Node:
def __init__(self, indented_line):
self.children = []
self.level = len(indented_line) - len(indented_line.lstrip())
self.text = indented_line.strip()

def add_children(self, nodes):
childlevel = nodes[0].level
while nodes:
node = nodes.pop(0)
if node.level == childlevel: # add node as a child
self.children.append(node)
elif node.level > childlevel: # add nodes as grandchildren of the last child
nodes.insert(0,node)
self.children[-1].add_children(nodes)
elif node.level <= self.level: # this node is a sibling, no more children
nodes.insert(0,node)
return

def as_dict(self):
if len(self.children) > 1:
return {self.text: [node.as_dict() for node in self.children]}
elif len(self.children) == 1:
return {self.text: self.children[0].as_dict()}
else:
return self.text

要解析文本,首先要创建一个根节点。然后,从文本中删除空行,并为每一行创建一个 Node 实例,将其传递给根节点的 add_children 方法。

root = Node('root')
root.add_children([Node(line) for line in indented_text.splitlines() if line.strip()])
d = root.as_dict()['root']
print(d)

结果:

{'apple': [
{'colours': ['red', 'yellow', 'green']},
{'type': 'granny smith'},
{'price': '0.10'}]
}

我认为应该可以一步完成,您只需调用一次 Node 的构造函数,并将缩进文本作为参数。

关于python - 从 python 中的缩进文本文件创建树/深度嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17858404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com