我的名单-
[
"Mathematics-2 (21SMT-125)",
"Mid-Semester Test-1",
"40",
"23.5",
"Mid-Semester Test-2",
"40",
"34",
"Disruptive Technologies - 2 (21ECH-103)",
"Experiment-1",
"20",
"19",
"Experiment-2",
"20",
"17",
"Experiment-3",
"20",
"18.5",
]
这个刺痛列表是使用bs4从html解析的。
格式转换为:
{
"Subject": {
"Mathematics-2 (21SMT-125)": {
"Mid-Semester Test-1": [40,23.5],
"Mid-Semester Test-2": [40,34]
},
"Disruptive Technologies - 2 (21ECH-103)": {
"Experiment-1": [20,19],
"Experiment-2": [20,17],
"Experiment-3": [20,18.5]
}
}
}
发布于 2022-05-08 20:34:20
问题是,您提供的列表是一个单一的项目列表,没有指示它们在所需结构中的分层位置。
您可以考虑的一个方法是,表示父对象(数学等)的条目是否.是唯一包含括号的条目,您可以在列表上迭代,使用字符串匹配或regex来标识父项,为其创建一个顶级对象,然后需要将接下来的两个条目作为键/值对的值添加为一个列表。
这假设您在子级别总是有两个后续的值。如果属性的数量不是固定的,但它们总是数值的,那么您可以使用regex来确定它是数字的还是非数字的,并一直将项添加到值列表中,直到您碰到另一个非数字条目,该条目将被视为层次结构中的下一个同级。
发布于 2022-05-08 20:44:42
我会回顾这一方法,并检查来自bs4的信息是否可以以更聪明的方式解析--尝试做更多的废弃步骤,第一步是达到主题,第二阶段是“学期/实验”三年级。
如果不可能,并且无法更改从bs4返回的数据。您唯一能做的就是尝试确定字符串是科目名称、学期名称还是年级/分数,并尝试使用while循环。题目的名称在结尾似乎有特殊的代码,可以用regexp区别于学期/实验的名称,而等级/scrore总是可以被解析为数字。
发布于 2022-05-08 20:44:49
对于与您的数据完全一样的数据(其中带有(
的字符串表示顶级条目,并且每个条目总是有两个数字),您可以想出一种类似于这样的状态机--但正如我所评论的,您确实应该改进解析代码,而不是,因为您正在从数据中抓取的HTML很可能已经结构化了。
def is_float(s):
try:
float(s)
return True
except ValueError:
return False
def parse_inp(inp):
flat_map = {}
stack = []
x = 0
while x < len(inp):
if "(" in inp[x]:
stack.clear()
if is_float(inp[x]) and is_float(inp[x + 1]):
flat_map[tuple(stack)] = (float(inp[x]), float(inp[x + 1]))
x += 2
stack.pop(-1)
continue
stack.append(inp[x])
x += 1
return flat_map
def nest_flat_map(flat_map):
root = {}
for key_path, values_list in flat_map.items():
dst = root
for key in key_path[:-1]:
dst = dst.setdefault(key, {})
dst[key_path[-1]] = values_list
return root
inp = [
# ... data from original post
]
nested_map = nest_flat_map(parse_inp(inp))
print(nested_map)
这将输出预期的
{
"Mathematics-2 (21SMT-125)": {
"Mid-Semester Test-1": (40.0, 23.5),
"Mid-Semester Test-2": (40.0, 34.0),
},
"Disruptive Technologies - 2 (21ECH-103)": {
"Experiment-1": (20.0, 19.0),
"Experiment-2": (20.0, 17.0),
"Experiment-3": (20.0, 18.5),
},
}
https://stackoverflow.com/questions/72164867
复制相似问题