システム開発 無限に階層化されている構造のデータを効率的に取得する方法(For文と関数

スポンサーリンク
スポンサーリンク

はじめに

普段、システム開発をしていないと、いろいろと忘れがちになっていますが、この無限に階層化されている構造のデータを効率的に取得する方法もその一つです。

フォルダ内の検索や、WEBサイトのクロールのスクレイピングなど利用するシーンは限定的で通常は余り使用しません。でも使うときにあれってなってしまう。(私だけかな。。。

なお、これはPythonだけでなく、システム開発の考え方になりますので、他の言語でも応用になります。

前提のデータ

美しくはないですが、わかりやすいように以下の連想配列型データを準備します。
意味合いとしては、3×5のデータ構造になっています。

もちろん、階層数はいくつでも構いませんし、連想配列型データでなくても構いません。

手法をご紹介するためのデータです。

aaa = {}
for i in range(0,3):
    aaa[i] = {}
    for j in range(0,3):
        aaa[i][j] = {}
        for k in range(0,3):
            aaa[i][j][k] = {}
            for l in range(0,3):
                aaa[i][j][k][l] = {}
                for m in range(0,3):
                    aaa[i][j][k][l][m] = m

pprint.pprint(aaa)
# {0: {0: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}},
#      1: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}},
#      2: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}}},
#  1: {0: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}},
#      1: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}},
#      2: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}}},
#  2: {0: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}},
#      1: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}},
#      2: {0: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          1: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}},
#          2: {0: {0: 0, 1: 1, 2: 2},
#              1: {0: 0, 1: 1, 2: 2},
#              2: {0: 0, 1: 1, 2: 2}}}}}

無制限に構造化されたデータを取得する方法

ポイントは、ループを関数にして、下位階層に移るときに、自身の関数を呼び出します

def xxx(data):
    for key, val in data.items():
        if type(val) == int:
            print(val)
        else:
            xxx(val)
    
xxx(aaa)
# 0
# 1
# 2
# 0
# 1
# 2
# 0
# 1
# 2
# ・・・

以上です。

とっても簡単ですが、つい忘れて不要な時間をとってします。

コメント

タイトルとURLをコピーしました