🗺️

pprintを上回る整形力のsetprintを作った話②

2025/04/13に公開

バグを修正したので、内容を変えて再度投稿しています。

setprintライブラリについて

このライブラリはpythonにて、多次元配列を扱う場合に有用なライブラリです。

特徴

  • 従来の "ツリー" や "ネスト表" とは別物
    「構造を見る」から「構造を空間で感じる」
    ように感覚や直感で理解できる、表示形式を追求しました。

  • インデックスを単なる数字ではなく、空間配列で表現する
    データをで見れる為、構造の地図のようになり、
    データのコロニーや想定構造の把握が容易になり、説明もしやすくなります。

配列の可視化例

2D配列

setprintでは配列の想定された構造通りに要素を並行化し、
配列構造を柔軟に表現する能力があり、
基本的な2D配列の整形を始め、多次元を経由した2D構造を維持して整形することができます。

写真データ(RBG値) の整形例

(実際に画像を表示した時と同じ形状 : 写真が数字になった感じ)

keep_settings
['y', 'x', 'x']
-----------------------------------------------------------------------------------------------------------

>nadarray 
    ┣━━━━ >nadarray ━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
    ┃               >nadarray ━┳━━━┳━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓
    ┃                         57  245 60           84   0  11            217 36  184           14  73  147 
    ┣━━━━ >nadarray ━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
    ┃               >nadarray ━┳━━━┳━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓
    ┃                         64  21  51           42  68  161           228 210 56            144 134 200 
    ┣━━━━ >nadarray ━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
    ┃               >nadarray ━┳━━━┳━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓
    ┃                         15  169 72           103 161 76            76  121 105           172 31  100 
    ┗━━━━ >nadarray ━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
                    >nadarray ━┳━━━┳━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓  >nadarray ━┳━━━┳━━━┓
                              231 171 46           246 28  200           44  176 183           58  115 217 

-----------------------------------------------------------------------------------------------------------

ルートの省略設定版

keep_settings
['yf', 'f', 'f']
-------------------------------------------------------------------------------------------------------------------------------

>nadarray 
    ┣━━━━ >nadarray [ >nadarray [ 57  245 60 ] >nadarray [ 84   0  11  ] >nadarray [ 217 36  184 ] >nadarray [ 14  73  147 ] ] 
    ┣━━━━ >nadarray [ >nadarray [ 64  21  51 ] >nadarray [ 42  68  161 ] >nadarray [ 228 210 56  ] >nadarray [ 144 134 200 ] ] 
    ┣━━━━ >nadarray [ >nadarray [ 15  169 72 ] >nadarray [ 103 161 76  ] >nadarray [ 76  121 105 ] >nadarray [ 172 31  100 ] ] 
    ┗━━━━ >nadarray [ >nadarray [ 231 171 46 ] >nadarray [ 246 28  200 ] >nadarray [ 44  176 183 ] >nadarray [ 58  115 217 ] ] 

-------------------------------------------------------------------------------------------------------------------------------

↕︎ y軸順序の合致/並行要素 を意味し、
↔︎ x軸次元の合致/並行要素 を意味します。

軸で配列の整合性を取ることにより、直線的に並行配列との合致部分が表現される為、
直線的で綺麗に整った整形をすることができ、他の配列との関係も容易に表すことができます。

他にも、次元共通ですが、展開する方向を柔軟に変化することが出来き、
オブジェクトや部分別で可視化をすることがきます。

他にも、親要素と子要素の関係を線 (┣ :┃:┗) (┳ : ━ : ┓) を使用し、
複雑な関係も、直感的にわかるデザインになるよう強化しました。

大規模な2D配列での整形例

このような整形を実現できるようにしようと思ったきっかけになった配列です。
元々、写真の文字を認識しようとしていたプロジェクトの最中に生まれた配列なのですが、
だんだんと、配列を見やすく表示していったら、ライブラリ化することになりました。
https://github.com/mtur2007/SetPrint/blob/main/Development_files/format_data/y_x_yf_f.txt

配列のデバッグ例

整合性を取ったり、展開する方向を柔軟に変化する方法は、デバッグにおいても有用です。

整合性を取る場合では 順序や空間が異なる要素が突出し、異常がわかりやすくなる
展開方向を柔軟に変化する方法では オブジェクトや部分別でデバッグをすることができる。
といったメリットがあります。

配列の 順序 / 次元 の合致

setprintでは、見本やテンプレートなどの想定された配列を並行要素とすることで、
他に並行させた配列で構造の整合性を取り、 配列の順序や次元の合致を調べることができます。

test_data = {
      'template':[[1,2,3]],                 #見本
      'bug'     :[[4,{'bug':5},6], [7,8,9]] #バグあり配列
}

配列毎で順序の合致を調べる

keep_settings
['y', 'y', 'x', 'x']
-------------------------------------------

◆dict 
  ┣━━ template:►list 
  ┃         ┗━━━━━━━ ►list ┳━━━┳━━━━━━━━━┓
  ┃                        1   2         3 
  ┗━━   bug   :►list 
            ┣━━━━━━━ ►list ┳━━━┳━━━━━━━━━┓
            ┃              4 ◆dict ━━┓   6 
            ┃                      bug:5 
            ┗━━━━━━━ ►list ┳━━━┳━━━━━━━━━┓
                           7   8         9 

-------------------------------------------

配列毎で次元の合致を調べる

keep_settings
['x', 'x', 'y', 'y']
-----------------------------------------------------------------

◆dict ━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓
      template:►list ━━┓     bug:►list ━━┳━━━━━━━━━━━━━━━━━┓
                     ►list             ►list             ►list 
                       ┣━━ 1             ┣━━   4           ┣━━ 7 
                       ┣━━ 2             ┣━━ ◆dict         ┣━━ 8 
                       ┃                 ┃     ┗━━ bug:5   ┃
                       ┗━━ 3             ┗━━   6           ┗━━ 9 

-----------------------------------------------------------------

要素毎 で次元の合致を調べる

keep_settings
['x', 'x', 'x', 'x']
-----------------------------------------------------------------------------

◆dict ━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
      template:►list ━━┓         bug:►list ━━┳━━━━━━━━━━━━━━━━━━━━━┓
                     ►list ┳━┳━┓           ►list ┳━━━┳━━━━━━━━━┓ ►list ┳━┳━┓
                           1 2 3                 4 ◆dict ━━┓   6       7 8 9 
                                                         bug:5 

-----------------------------------------------------------------------------

要素毎 で順序の合致を調べる

keep_settings
['y', 'y', 'y', 'y']
---------------------------------------

◆dict 
  ┣━━ template:►list 
  ┃         ┗━━━━━━━ ►list 
  ┃                    ┣━━   1   
  ┃                    ┣━━   2   
  ┃                    ┗━━   3   
  ┗━━   bug   :►list 
            ┣━━━━━━━ ►list 
            ┃          ┣━━   4   
            ┃          ┣━━ ◆dict 
            ┃          ┃     ┗━━ bug:5 
            ┃          ┗━━   6   
            ┗━━━━━━━ ►list 
                       ┣━━   7   
                       ┣━━   8   
                       ┗━━   9   

---------------------------------------

配列を可視化する際に、ぜひ活用してみてくだい!!

インストール方法

pip Install setprint

雛形の実行例

from setprint import SetPrint


#                 整形したい配列を指定
#                         ∨
list_data    = SetPrint(datas)

#            '''  展開したい方向を指定
#                 (以下で詳しく説明)  '''
#                         ∨
keep_settings = {1:'x',3:'yf',4:'f'}

# 整形の実行
format_texts = list_data.set_collection( route='SLIM', y_axis=False, keep_settings=keep_settings, verbose=False )

# 結果の表示 : テキストファイルへの書き込み 
# (表示方法は任意 : !!! 最後に 改行'\n' を忘れずに !!! )
with open('output.txt','w') as f:
    for line in format_texts:
            f.write(line+'\n')

で使用できます。

詳しい展開方法や使い方について

github:
https://github.com/mtur2007/SetPrint/

公開先

pypi:
https://pypi.org/project/setprint/

Discussion