簡體   English   中英

python-解析列表中的嵌套字典以將父子關系存儲在新列表中

[英]python - parse nested dictionaries in list to store parent & child relationships in new list

我解析了一個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**

整個過程是一個元組列表,因此循環遍歷。 元組中的第一項是父級,第二項是元組的數組(從技術上講,這是一堆嵌套在彼此內部的元組,但是我假設這是一個錯字,因為您從未關閉過它們)。

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM