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

コメント