首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎么把它转换成丁字

我怎么把它转换成丁字
EN

Stack Overflow用户
提问于 2022-05-08 20:29:07
回答 4查看 63关注 0票数 -1

我的名单-

代码语言:javascript
运行
复制
[
    "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解析的。

格式转换为:

代码语言:javascript
运行
复制
{
    "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]
        }
    }
}
EN

回答 4

Stack Overflow用户

发布于 2022-05-08 20:34:20

问题是,您提供的列表是一个单一的项目列表,没有指示它们在所需结构中的分层位置。

您可以考虑的一个方法是,表示父对象(数学等)的条目是否.是唯一包含括号的条目,您可以在列表上迭代,使用字符串匹配或regex来标识父项,为其创建一个顶级对象,然后需要将接下来的两个条目作为键/值对的值添加为一个列表。

这假设您在子级别总是有两个后续的值。如果属性的数量不是固定的,但它们总是数值的,那么您可以使用regex来确定它是数字的还是非数字的,并一直将项添加到值列表中,直到您碰到另一个非数字条目,该条目将被视为层次结构中的下一个同级。

票数 1
EN

Stack Overflow用户

发布于 2022-05-08 20:44:42

我会回顾这一方法,并检查来自bs4的信息是否可以以更聪明的方式解析--尝试做更多的废弃步骤,第一步是达到主题,第二阶段是“学期/实验”三年级。

如果不可能,并且无法更改从bs4返回的数据。您唯一能做的就是尝试确定字符串是科目名称、学期名称还是年级/分数,并尝试使用while循环。题目的名称在结尾似乎有特殊的代码,可以用regexp区别于学期/实验的名称,而等级/scrore总是可以被解析为数字。

票数 0
EN

Stack Overflow用户

发布于 2022-05-08 20:44:49

对于与您的数据完全一样的数据(其中带有(的字符串表示顶级条目,并且每个条目总是有两个数字),您可以想出一种类似于这样的状态机--但正如我所评论的,您确实应该改进解析代码,而不是,因为您正在从数据中抓取的HTML很可能已经结构化了。

代码语言:javascript
运行
复制
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)

这将输出预期的

代码语言:javascript
运行
复制
{
    "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),
    },
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72164867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档