🚀

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

2024/11/23に公開

初めに

pprintなどでは対応できない、可変長な多次元配列を整形できるツールを開発しました。

詳しい使い方

github:

https://github.com/mtur2007/SetPrint

pypi:

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

インストール方法

pip install setprint

pprintの問題点

リストの中身は、numpy配列のような整った配列ではないことがあります。

整った配列の例:

[
 [1, 2, 3], 
 [4, 5, 6], 
 [7, 8, 9], 
 [10, 11, 12], 
 [13, 14, 15]
]

pprintには対応出来ない配列の例:

[
 [[1,2] ,2            , 3], 
 [4     ,[1,2     ,3] , 6], 
 [7     ,8            , 9], 
 [10    ,[1,[1,2] ,3] , 12], 
 [13    ,14           , 15]
]

次元の入り方が不規則なリストを整列表示しようとしても
pprintでは整列させることができませんでした。

そこで

多次元でも問題なく整形することができるsetprintライブラリを開発しました。
※実行方法や、引数と整形の関係などの詳しいライブラリの説明は、
 pypiや、githubに書いている為、割愛させてもらいます。

setprintライブラリ

set_list()

set_listはpprintでは整形することができなかったリストを整形できる関数です。

配列例:

[
 [[1,2] ,2            , 3], 
 [4     ,[1,2     ,3] , 6], 
 [7     ,8            , 9], 
 [10    ,[1,[1,2] ,3] , 12], 
 [13    ,14           , 15]
]

整形結果:

整形後のログ:
=================================================================
 {} |  {n}                                                      |
    |-----------------------------------------------------------|
    :                                                           :
    |  ►list [ ►list { 1 2 )     2   - -----   - -   -    3 ]   |
    |  ►list [     4   - -   ►list { 1     2   - -   3 )  6 ]   |
    |  ►list [     7   - -       8   - -----   - -   -    9 ]   |
    |  ►list [    10   - -   ►list { 1 ►list { 1 2 ) 3 ) 12 ]   |
    |  ►list [    13   - -      14   - -----   - -   -   15 ]   |

=================================================================

自分が現在、興味本位で作成している自作の文字検出のデータを整列させると、
[
[ [i],[m] ],
[ [i],[m] ],
[ [d],[e],[f(バグあり)] ]
]

=============================================
  {} |  {n}                                 |
     |--------------------------------------|
     :                                      :
     |  data_type: <class 'list'>           |
     |  data_type: <class 'list'>           |
     |  data_type: <class 'list'>           |

=====================================================================================================
 {0} |  [0]{n}                              |  [0][0]{n}                 |  [0][1]{n}               |
     |--------------------------------------|----------------------------|--------------------------|
     :                                      :                            :                          :
     |  data_type: <class 'numpy.ndarray'>  |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 0 0 1 0 0 ]   |
     |  data_type: <class 'numpy.ndarray'>  |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 0 0 0 0 0 ]   |
     |                                      |  ►list [ 1 1 1 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 0 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |                          |
     |                                      |  ►list [ 1 1 0 1 1 ]       |                          |
     |                                      |  ►list [ 0 0 0 0 0 ]       |                          |

=====================================================================================================
 {1} |  [1]{n}                              |  [1][0]{n}                 |  [1][1]{n}               |
     |--------------------------------------|----------------------------|--------------------------|
     :                                      :                            :                          :
     |  data_type: <class 'numpy.ndarray'>  |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 0 0 0 0 0 ]   |
     |  data_type: <class 'numpy.ndarray'>  |  ►list [ 1 1 1 1 1 ]       |  ►list [ 0 0 0 0 1 0 ]   |
     |                                      |  ►list [ 1 1 1 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 0 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |  ►list [ 0 1 1 0 1 0 ]   |
     |                                      |  ►list [ 1 1 0 1 1 ]       |                          |
     |                                      |  ►list [ 0 0 0 0 0 ]       |                          |

============================================================================================================================================
 {2} |  [2]{n}                              |  [2][0]{n}                 |  [2][1]{n}               |  [2][2]{n}                           |
     |--------------------------------------|----------------------------|--------------------------|--------------------------------------|
     :                                      :                            :                          :                                      :
     |  data_type: <class 'numpy.ndarray'>  |  ►list [ 1 1 1 1 1 1 0 ]   |  ►list [ 1 1 0 0 0 0 ]   |  ►list [ 1 1 1     0   ---   0 0 ]   |
     |  data_type: <class 'numpy.ndarray'>  |  ►list [ 1 1 1 1 1 1 0 ]   |  ►list [ 1 0 0 1 1 0 ]   |  ►list [ 1 1 0     0   ---   1 1 ]   |
     |  data_type: <class 'list'>           |  ►list [ 1 1 1 1 1 1 0 ]   |  ►list [ 0 0 1 1 1 0 ]   |  ►list [ 1 1 0     0   ---   1 1 ]   |
     |                                      |  ►list [ 1 1 0 0 0 0 0 ]   |  ►list [ 0 0 0 0 0 0 ]   |  ►list [ 0 0 0     0   ---   0 0 ]   |
     |                                      |  ►list [ 1 0 1 1 1 0 0 ]   |  ►list [ 0 0 1 1 1 1 ]   |  ►list [ 1 1 0 ►list { bug ) 1 1 ]   |
     |                                      |  ►list [ 0 0 1 1 1 0 0 ]   |  ►list [ 0 0 1 1 0 0 ]   |  ►list [ 1 1 0     1   ---   1 1 ]   |
     |                                      |  ►list [ 0 0 1 1 1 0 1 ]   |  ►list [ 1 0 0 0 0 1 ]   |  ►list [ 1 0 0     1   ---   1 1 ]   |
     |                                      |  ►list [ 0 0 1 1 1 0 1 ]   |                          |  ►list [ 1 0 0     1   ---   1 1 ]   |
     |                                      |  ►list [ 0 0 1 0 0 0 1 ]   |                          |  ►list [ 1 0 1     1   ---   1 1 ]   |
     |                                      |  ►list [ 1 0 0 0 0 0 1 ]   |                          |  ►list [ 1 0 1     1   ---   1 1 ]   |

============================================================================================================================================

のような感じに整形でき、ボックス毎に表現されるので、
どこに何があるのかが非常に視覚的にわかりやすくなります。
あえて[2][2][4][3]にバグを模した配列を格納したのですが、
pprintでは表示することができないものになります。

配列を加工せずに整形させた例です。
https://github.com/mtur2007/SetPrint/blob/main/ocr_data.txt

setprint(バージョン0.2.0)の問題点

  • シーケンス型(リスト、タプル、numpy配列)にしか対応していない。
  • X方向へ階層が多いと実行時間が非常に長くなる。
  • テキスト自体の整列は文字列として扱っているので、少数だった場合、ずれる。
  • 多次元配列のフラット化には階層表現の限度があり可読性に問題がある。

次回以降のアップデートで、上記の問題点を改善していく予定ですので、お待ちください。
(※学校行事があるので更新は遅くなりますがご了承ください。)

最後に

このライブラリについての問題点や要望などのコメントや意見を募集しています!
また、便利と思えた場合は いいねやスター で、評価をお願いします。

Discussion