Pythonで単語リストを枠線で囲む方法 ― フレーム幅を揃えるアルゴリズム
プログラミングの定番練習問題の一つに、単語のリストを受け取り、それぞれの行を同じ幅の長方形フレームで囲んで出力するというものがあります。一見シンプルですが、文字幅の揃え方や罫線の配置など、細部まで正確に処理する必要があります。この記事では、Pythonでこの問題を解くための手順と実装例をわかりやすく解説します。
たとえば、入力が ['hello', 'world', 'python', 'programming', 'nice'] の場合、期待される出力は次のようになります。
*************** * hello * * world * * python * * programming * * nice * ***************
解き方のアプローチ
この問題は、以下の手順で解くことができます。
- まず、リスト内で最も長い単語の長さを求める(これを
lとする) - 星印(
*)をl+4回繰り返した文字列を作成し、これを上下の罫線として使う - 各単語
iについて、「*+ 単語 + 余白スペース +*」という形式の行を生成する。余白の幅は「l− その単語の長さ + 1」で計算する - すべての行を連結した後、末尾にもう一度星印
l+4個の罫線を追加して完成させる
左右に1文字分ずつのマージンと罫線自体の2文字分を考慮しているため、罫線の長さが l+4 になる点がポイントです。
実装例(Pythonコード)
class Solution:
def solve(self, words):
l = max(len(x) for x in words)
st = '*'*(l+4) + '\n'
for i in words:
st += '* ' + i + ' '*(l-len(i)+1) + '*' + '\n'
return st + '*'*(l+4)
ob = Solution()
words = ['hello','world','python','programming','nice']
print(ob.solve(words))入力
['hello','world','python','programming','nice']
出力
*************** * hello * * world * * python * * programming * * nice * ***************
コードのポイント
このアルゴリズムの時間計算量は O(n × m) です(n は単語数、m は最長単語の長さ)。max() 関数とジェネレータ式 (len(x) for x in words) を組み合わせることで、最長単語の長さを1行で簡潔に取得できる点が見どころです。
また、各行の末尾に改行文字 '\n' を付加しておくことで、print() 出力時にそのまま整形されたフレームとして表示されます。文字列の連結には += を使用していますが、大量のデータを扱う場合は join() を使った実装の方が効率的になることも覚えておくとよいでしょう。
-
Python TkinterでEntryウィジェットの幅を100%(全幅)に設定する方法
TkinterのEntryウィジェットは、テキストフィールドに1行分のユーザー入力を受け付けるための部品です。コンストラクタにデフォルトの属性や値を渡すことで、Entryウィジェットのさまざまなプロパティを変更できます。ここでは、アプリケーション内で横幅いっぱい(100%)に広がるEntryウィジェットを作成する方法を紹介します。実現方法はいくつかありますが、最もシンプルなのはPackジオメトリマネージャーを使ってEntryウィジェットを配置し、fill(x または y)オプションを指定する方法です。これにより、ウィジェットの幅を親ウィンドウのX軸方向に合わせて自動的に拡張できます。サンプルコ
-
Pythonのtkinterでラベルのテキストを揃える方法|justifyプロパティの使い方を解説
TkinterのLabelウィジェットは、アプリケーション内に画像を追加したり、テキストを表示したりするために使用されます。ライブラリにはウィジェットやそのプロパティをスタイリングするためのさまざまな関数やメソッドが用意されています。ラベルウィジェット内のテキストを揃えたい場合は、justifyプロパティを使用します。このプロパティは、テキストの位置や配置(RIGHT・LEFT・CENTERなど)を指定するために一般的に使われます。サンプルコード以下の例では、justifyプロパティを使ってラベル内のテキストの位置を揃えています。# tkinterライブラリをインポート from tkinte