python解析列表中的嵌套字典以在新lis中存储父级和子级关系

2024-04-29 18:38:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我解析了一个mvn依赖树来创建一个存储信息的列表。我希望能够浏览此列表并将父级+子级组合存储在新列表中。下面摘录了解析后的mvn树的外观(使用pprint)&;我添加了带有#的注释,以更明确地显示关系。你知道吗

[({'name': '"org.antlr antlr4"'},    #parent1
  {'children': [({'name': '"org.antlr antlr4-runtime"'},    #child1-1
                ({'name': '"org.antlr antlr-runtime"'},    #child1-2
                ({'name': '"org.antlr ST4"'},    #child1-3
                ({'name': '"org.abego.treelayout org.abego.treelayout.core"'},    child1-4 & parent2
                 {'children': [({'name': '"org.hamcrest hamcrest-core"'},   #child2-1
({'name': '"org.slf4j slf4j-log4j12"'},    #parent3
 {'children': [({'name': '"org.apache.commons commons-lang3"'})]    #child3-1

下面是我混乱的尝试:

def relate(tree):

    for name, subtree in tree.items():
        group, artifact = name.split(":")
        g = "groupId:" + group
        a = "artifactId:" + artifact
        c = {"children": "children"}

    family = []
    parent = name.group + name.artifact
    if subtree:
        for c in subtree:
            child = name.group + name.artifact
        family.append((parent, child))

    return family

有没有一种方法可以遍历这个并返回一个新的列表,该列表返回如下所示的信息?你知道吗

[[nameParent1, nameChild1-1],
[nameParent1, nameChild1-2],
[nameParent1, nameChild1-3],
[nameParent1, nameChild1-4],
[nameParent2, nameChild2-1],
[nameParent3, nameChild3-1]]

所以对于这段摘录来说

[[org.antlr antlr4, org.antlr antlr4-runtime],
[org.antlr antlr4, org.antlr antlr-runtime],
[org.antlr antlr4, org.antlr ST4],
[org.antlr antlr4, org.abego.treelayout org.abego.treelayout.core],
[org.abego.treelayout org.abego.treelayout.core, org.hamcrest hamcrest-core],
[org.slf4j slf4j-log4j12, org.apache.commons commons-lang3]]

我不确定如何在跟踪关系的同时重复这个过程&它也足够通用,可以处理任何数量的有孩子的孩子和有孩子的孩子(如果需要澄清,请告诉我)。 提前谢谢!你知道吗


**#FINAL CODE -> based off of Michael Bianconi's answer**
def getParentsChildren(mvn: tuple) -> list:
    result = []
    parent = mvn[1]['oid']
    children = mvn[5]['children']
    for child in children:
        result.append([parent, child[1]['oid']])
        if len(child) >= 2:  **# MODIFIED LINE**
            result.extend(getParentsChildren(child))
    return result

def getAll(mvn: list) -> list:
    result = []
    for m in mvn:
        result.extend(getParentsChildren(m))
    return result    **# MODIFIED LINE**

Tags: nameorgcorechild列表resultruntimechildren
1条回答
网友
1楼 · 发布于 2024-04-29 18:38:10

整个过程就是一个元组列表,所以循环一下。元组中的第一项是父项,第二项是一个元组数组(从技术上讲,这是一组嵌套在彼此内部的元组,但我假设这是一个输入错误,因为您从未关闭它们)。你知道吗

def getParentsChildren(mvn: tuple) -> list:
    result = []
    parent = mvn[0]['name']
    children = mvn[1]['children']

    for child in children:
        result.append([parent, child[0]['name'])
        if child.length == 2:  # has children
            result.extend(getParentsChildren(child))

    return result

 def getAll(mvn: list) -> list:
    result = []
    for m in mvn:
        result.extend(getParentsChildren(m))

相关问题 更多 >