2

Python を使用して、ツリーに構築したい相互の親子関係を含む辞書オブジェクトのリストがあります。例えば:

{'UI': 'T071', 'NAME': 'Entity', 'PARENT': None, 'CHILDREN': 'Conceptual Entity'}
{'UI': 'T077', 'NAME': 'Conceptual Entity', 'PARENT': 'Entitity', 'CHILDREN': 'Organism Attribute, Finding, Idea or Concept'}
{'UI': 'T032', 'NAME': 'Organism Attribute', 'PARENT': 'Conceptual Entity', 'CHILDREN': 'Clinical Attribute'}
etc.

データセットには合計 4 つのルート ノードがあり ('PARENT' は [なし] に設定)、4 つの別個のツリーが作成されます。そこで、木のリストを作ろうと思っていました。

データは必ずしも任意の順序であるとは限りません (したがって、階層の上位にあるノードが必ずしもリストの上位にあるとは限りません)。また、ID (UI) は特定の順序ではありません (ツリー内で T071 が T072 より上位にあるとは限りません)。それらの名前は一意であり、データセットは ID (UI) の代わりにそれらの名前を使用して関係を示します。

私はこの単純なクラスを持っています:

class node():
    def __init__(self, value):
        self.value = value
        self.children = []

    def add_child(self, obj):
        self.children.append(obj)

私はこれにアプローチする方法に少し困惑しています。提案は大歓迎です。

4

3 に答える 3

2

ツーパスがベストだと思います。最初に、名前をノードにリンクするディクショナリを作成します。次に、アイテムを効率的に追加できます。

私のコード:

nodes = dict((e["NAME"], node(e)) for e in l)
for e in l:
    if e["PARENT"] is not None:
        nodes[e["PARENT"]].add_children(nodes[e["NAME"])

ルートが必要な場合は、上記の if を使用するか、ノードをフィルター処理できます。

roots = [n for n in nodes.values() if d.value["PARENT"] is None]
于 2013-04-25T00:27:01.410 に答える
1

*ix プロセス ツリーを 1 つの dict と、各親 pid の子プロセス pid のリストで表したことがあります。したがって、次のようになります。

dict_[1] = [2, 3, 4]
dict_[2] = [5, 100]
dict_[3] = [6, 200]
dict_[4] = [7, 300]
dict_[6] = [400]

それはかなりうまくいくように見えました。

リーフ ノードを空のリストで存在させるか、ツリーに表示しないようにするかはオプションです。上記で、辞書レベルでツリーに表示されないことを示しました。

これは、pid (ノード) がツリー内の 1 つの場所にしか表示されない場合にのみ適切だと思います。例えば、100 は 24 の子になることはできません。

于 2013-04-25T02:53:02.267 に答える