Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでネストしたリストをツリー構造の辞書(dict)に変換する方法

Pythonでは、ネストされたリスト(リストの中にリストが入ったデータ)を、木構造(ツリー構造)として扱える辞書に変換したいケースがあります。例えば、階層的なカテゴリやパス情報を表現する際に便利です。

本記事では、ネストしたリストをツリー状の辞書へ変換するための2つのアプローチを、具体的なコード例とともに解説します。

方法1:スライスを使った変換

まず紹介するのは、スライスを活用するシンプルな方法です。各サブリストの要素を [::-1] によるスライスで逆順に走査し、キーがまだ存在しない場合は空の辞書を作成して追加していきます。これにより、リストの末尾から順に親子関係が組み立てられ、最終的にツリー構造が完成します。

コード例

def CreateTree(lst):
    new_tree = {}
    for list_item in lst:
        currTree = new_tree

        # 要素を逆順にたどりながら辞書を入れ子にしていく
        for key in list_item[::-1]:
            if key not in currTree:
                currTree[key] = {}
            currTree = currTree[key]
    return new_tree

# 変換対象のリスト
listA = [['X'], ['Y', 'X'], ['Z', 'X'], ['P', 'Z', 'X']]
print(CreateTree(listA))

実行結果

{'X': {'Y': {}, 'Z': {'P': {}}}}

この出力を見ると、'X' を頂点とし、その下に 'Y''Z' がぶら下がり、さらに 'Z' の下に 'P' が配置されたツリー構造ができあがっていることがわかります。

方法2:reduce と getitem を使った変換

次に、標準ライブラリの functools モジュールと operator モジュールを利用する方法です。reducegetitem を組み合わせることで、「指定したパス上の要素を取得する関数」と「指定した位置に新しい辞書を設定する関数」の2つを定義できます。

こちらも同様にスライスでリストの要素を逆順にしてから、作成した2つの関数を適用することで、ツリー構造を持つ辞書を生成します。

コード例

from functools import reduce
from operator import getitem

def getTree(tree, mappings):
    # 指定されたパスをたどってノードを取得する
    return reduce(getitem, mappings, tree)

def setTree(tree, mappings):
    # パスの末端に空の辞書を設定する
    getTree(tree, mappings[:-1])[mappings[-1]] = dict()

# 変換対象のリスト
lst = [['X'], ['Y', 'X'], ['Z', 'X'], ['P', 'Z', 'X']]
tree = {}
for i in lst:
    setTree(tree, i[::-1])
print(tree)

実行結果

{'X': {'Y': {}, 'Z': {'P': {}}}}

方法1とまったく同じ結果が得られました。このアプローチは、パス操作のロジックが関数として分離されているため、コードの再利用性や可読性を重視したい場合に特に有効です。

まとめ

ネストしたリストをツリー構造の辞書に変換するには、次の2つの方法があります。

  • スライスを使う方法: シンプルで直感的。小規模な処理や学習用途に向いています。
  • reduce と getitem を使う方法: 処理を関数化できるため、大規模なコードベースや再利用を前提とした実装に向いています。

どちらの方法でも同じ結果が得られるので、プロジェクトの規模やコーディングスタイルに応じて使い分けるとよいでしょう。

  1. Pythonで文字のリストを文字列に変換する方法を解説

    Pythonでは、リスト内の個々の要素をひとつの文字列にまとめたい場面がよくあります。たとえば、データを保存したり送信したりする際に必要となるシリアライズ(直列化)の処理では、このような変換が非常に役立ちます。具体的には、次のような変換を指します。[h, e, l, l, o, , w, o, r, l, d] → hello worldjoinメソッドを使った変換Pythonには、このような変換を実現するためのjoin()メソッドが標準で用意されています。joinメソッドは、区切り文字(デリミタ)として使う文字列に対して呼び出し、引数に渡したリストの各要素を連結します。今回は各文字をつなげ

  2. Pythonでリストをタプルに変換する方法

    Pythonでは、リストをタプルに変換するのは非常に簡単です。組み込み関数である tuple() 関数にリストを引数として渡すだけで、変換することができます。サンプルコードmy_list = [1, 2, 3] my_tuple = tuple(my_list) print(my_tuple)出力結果上記のコードを実行すると、以下のような出力が得られます。(1, 2, 3)解説tuple() 関数は、リストだけでなく文字列や辞書などのイテラブル(反復可能なオブジェクト)もタプルに変換できます。タプルはリストと異なりイミュータブル(変更不可)であるため、データを誤って書き換えたくない場合や、辞書