<<前 [TOP] 次>>
次のプログラムを作ってみましょう。
【hyou1.py】
# hyuoou1.py class Hyou1: def __init__(self): self.data = [ [ '1', '2', '3', '4', '5', '6' ],[ 'apple', 'banana', 'orange', 'peach', 'tomato', 'melon' ],[ '100', '50', '70', '200', '80', '400' ] ] def drawTable( data ): for i in range(0, len(data)): for j in range(0, len(data[0])): print ("|" + data[i][j] + "\t", end="") print( '|') h = Hyou1() drawTable( h.data )
二次元配列を使用しています。
エスケープ記号の"\t"
を使って'|'
の位置を揃えています。
このプログラムの欠点は、dataに与える文字列の文字数が多いと、うまく'|'
が揃わないところにあります。
出力結果です。
次のプログラムを作ってみましょう。
【hyou2.py】
# hyou2.py class Hyou2: def __init__(self): self.data = [ ['1', '2', '3', '4', '5', '6' ],[ 'apple', 'banana', 'orange', 'peach', 'strawberry', 'melon' ],[ '100', '50', '70', '200', '10','400' ] ] def drawTable( data ): max = maxWidth( data ) for i in range(0, len(data) ): for j in range(0, len(data[0])): print ('|' + str(data[i][j]), end="") for k in range(len(data[i][j]), max ): print (' ', end= "") print('|') def maxWidth(data): max = 0 for i in range(0, len(data)): for j in range(0, len(data[0]) ): if ( len(data[i][j]) > max ) : max = len(data[i][j]) return max h = Hyou2() drawTable(h.data)
最大文字数にあわせてスペースを入れて表を表示するプログラムです。
表の大きさが一定になります。
文字数が多くなっても列が合わなくなることはありません。
maxWidth( )メソッドを見てください。
def maxWidth(data): max = 0 for i in range(0, len(data)): for j in range(0, len(data[0]) ): if ( len(data[i][j]) > max ) : max = len(data[i][j]) return max
len(data[0])
という記述がありますが、これはdata[0]の大きさを示します。
ここでのdata[0]とは、['1', '2', '3', '4', '5', '6' ]
を示しますので、len(data[0]) = 6
となります。
len(data[i][j])
という記述もあります。
この i と j には0〜5の数字が入ります。
例えば、data[1][4].lengthなら、strawberryの文字数なので、10になります。
単にlen(data)とすると、文字列の固まりの数、今回は3になります。
drawTable()メソッドでは、文字列の最大数分スペースを表示させています。
このプログラムの欠点は、必ず左寄せになってしまうことです。
出力結果です。
次のプログラムを作ってみましょう。
【hyou3.py】
# hyou3.py class Hyou3: def __init__(self): self.data = [ ['1', '2', '3', '4', '5', '6' ],[ 'apple', 'banana', 'orange', 'peach', 'strawberry', 'melon' ],[ '100', '50', '70', '200', '10','400' ] ] def drawTable( data ): max = maxWidth( data ) for i in range(0, (len(data)) ): for j in range(0, (len(data[0])) ): print ('|' + str(data[i][j]), end="") for k in range(len(data[i][j]), max[j]): print( ' ', end="") print ('|') def maxWidth( data ): max = list(range(6)) for j in range(0, len(data[0]) ): max[j] = 0 for i in range(0, len(data) ): if ( len(data[i][j]) > max[j] ) : max[j] = len(data[i][j]) return max h = Hyou3() drawTable( h.data )
maxWidth()メソッドを見てください。
この部分が今までのプログラムと違うところです。
max = list(range(6))
この記述は、maxに配列を格納する箱を用意しています。
各列ごとの文字数を調べ、maxに格納していきます。
それを受けたdrawTable()メソッドは、各列ごとの最大文字数に対してスペースの数を決めています。
列の大きさは文字数の大きさによって違ってきます。
出力結果です。
次のプログラムを作ってみましょう。
【hyou4.py】
# hyou4.py import re class Hyou4: def __init__(self): self.data = [ [ '1', '2', '3', '4', '5', '6' ], [ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ], [ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ], ['tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou' ] ] def drawTable( data ): max = maxWidth( data ) for i in range(0, len(data) ): for j in range(0, len(data[0]) ): print( '|' + str(data[i][j]), end="") if re.match(r'^[a-z]+$', data[i][j]): for k in range(len(data[i][j]), (max[j])): print (' ', end="") elif (re.match(r'^[0-9]+$', data[i][j] )) : for k in range(len(data[i][j]), max[j]): print (' ', end="") else: for k in range(len(data[i][j]), (max[j]-len(data[i][j]))) : print (' ', end="") print('|') def maxWidth( data ): max = list(range(6)) for j in range(0, len(data[0])): max[j] = 0 for i in range(0, len(data)): count = countv( data[i][j] ) if ( count > max[j] ) : max[j] = count return max def countv( str ): count = 0 a = list(str) for i in range(0, len(str)): if ( re.match(r'^[a-z]+$', a[i])): count+=1 elif ( re.match(r'^[0-9]+$', a[i])): count+=1 else: count+=2 return count h = Hyou4() drawTable( h.data )
日本語の表示を認識してスペースの数を決めるプログラムです。
日本語一文字を半角スペース一つとして数えています。
countv()メソッドを見てください。
これは、文字の種類によって文字の大きさをカウントしていくメソッドです。
ここでlist()を使用しています。
a = list(str)
list(str)
とすると与えられた文字列strを、一文字ずつに分けて配列 a に格納できます。
for i in range(0, len(str)): if ( re.match(r'^[a-z]+$', a[i])): count+=1 elif ( re.match(r'^[0-9]+$', a[i])): count+=1 else: count+=2
1文字ずつに分けられた文字は、それが英数字なのかどうか判別されます。
re.mach()を使用して、正規表現の内容と合っていればtrueを返します。
match()を利用するには「import re」しなければなりません。
文字が英数字なら1つカウントし、それ以外なら(全角なら)2つカウントするようにしています。
このカウントをもとに、各列ごとの最大文字数に対応するスペース数を決めています。
正規表現の内容です。
# 小文字アルファベットと一致 ^[a-z]+$ # 0-9の数字と一致 ^[0-9]+$
「r' '」で囲まれた部分は正規表現として扱われます。
出力結果です。
↓↓クリックして頂けると励みになります。