はじめに
普段、システム開発をしていないと、いろいろと忘れがちになっていますが、この無限に階層化されている構造のデータを効率的に取得する方法もその一つです。
フォルダ内の検索や、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 # ・・・
以上です。
とっても簡単ですが、つい忘れて不要な時間をとってします。
コメント