<<前 [TOP] 次>>
次のプログラムを作ってみましょう。
【hyou5.py】
# hyou5.py import re class Hyou5: def __init__(self): self.data = [[ '1', '2', '3', '4', '5', '6' ], [ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ], [ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ], [ 'tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou' ]] self.left = 0 self.right = 1 def drawTable( data, flag ): max = maxWidth( data ) for i in range(0, (len(data))): drawLine( data[i], max, flag ) def drawLine( line, max, flag ): if (flag == 0) : for j in range(0, (len(line))): print ('|' + str(line[j]), end="") for k in range((countv( line[j] )+2), max[j] ): print( ' ', end="") elif (flag == 1) : for j in range(0, (len(line))): print ('|', end="") for k in range(countv( line[j]) +2, max[j] ): print (' ', end="") print (line[j], 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+=1 return count h = Hyou5() drawTable( h.data, h.left ) drawTable( h.data, h.right )
Leftは左寄せの時のフラッグとして使います。
Rightは右寄せです。
if文でLEFTかRIGHTかを判断し、それに基づいてスペースを前に入れるか、後に入れるかを決めています。
出力結果です。
次のプログラムを作ってみましょう。
【hyou6.py】
# hyou6.py import re class Hyou6: def __init__(self): self.data = [[ '1', '2', '3', '4', '5', '6' ], [ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ], [ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ], [ 'tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou' ]] self.left = 0 self.right = 1 def drawTable( data, flags ): max = maxWidth( data ) for i in range(0, len(data)) : drawLine( data[i], max, flags[i] ) def drawLine( line, max, flag ): if ( flag == 0 ): for j in range(0, len(line)): print ('|' + str(line[j]), end="") for k in range(countv( line[j] ), max[j] ): print (' ', end="") elif ( flag == 1 ) : for j in range(0, len(line) ): print ('|', end="") for k in range(countv( line[j] )+2, max[j] ): print (' ', end="") print (line[j], 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+=1 return count h = Hyou6() flags = [ h.left, h.left, h.right, h.right ] drawTable( h.data, flags )
このプログラムでは、flagの配列を用意しています。
flags = [ h.left, h.left, h.right, h.right ]
drawTable()メソッドには、flagの配列を受け取るメソッドが増えています。
flagの配列を受け取ったdrawTable()メソッドは、flags[0]から順番にdrawLineメソッドにflagを渡していきます。
これにより、ラインごとに右寄せか左寄せか違う表示になります。
実行結果です。
次のプログラムを作ってみましょう。
【hyou7.python】
# hyou7.py import re class Hyou7: def __init__(self): self.data = [[ '1', '2', '3', '4', '5', '6' ], [ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ], [ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ], [ 'tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou' ]] self.left = 0 self.right = 1 self.center = 2 def drawTable( data, flags ): max = maxWidth( data ) for i in range(0, (len(data))): drawLine( data[i], max, flags[i] ) def drawLine( line, max, flag ): if ( flag == 0 ) : for j in range(0, (len(line)) ): print ('|' + (line[j]), end=" ") for k in range(countv( line[j] )+1, max[j] ): print( ' ', end=" ") elif ( flag == 1 ) : for j in range(0, len(line) ): print ('|', end="") for k in range((countv( line[j] )+1), max[j] ): print (' ', end="") print (line[j], end="") elif ( flag == 2 ) : for j in range(0, len(line) ): s=(max[j]-countv(line[j])) if ((s%2)==0): s1=s2=s/2 else: s1=s/2+1 s2=s/2 print( '|', end=" ") for k in range(1, int(s1+1)): print (' ', end="") print (line[j], end="") for k in range((int(max[j]-s2)), (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)): 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+=0 elif ( re.match(r'^[0-9]+$', a[i])): count+=-7 else: count+=-2 return count h = Hyou7() flags = [ h.center, h.center, h.center, h.left ] drawTable( h.data, flags )
中央寄せが出来るように書き足しました。
elif ( flag == 2 ) : for j in range(0, len(line) ): s=(max[j]-countv(line[j])) if ((s%2)==0): s1=s2=s/2 else: s1=s/2+1 s2=s/2 print( '|', end=" ") for k in range(1, int(s1+1)): print (' ', end="") print (line[j], end="") for k in range((int(max[j]-s2)), (max[j]) ): print (' ', end="")
これが、中央寄せをさせる部分です。
文字列の最大数が割り切れる場合と割り切れない場合の処理に分けています。
if ((s%2)==0):
countv()メソッドからこの文字列のカウント数を得ています。
countv( line [j] )
半角英数の文字カウントがうまく合いません。
もう少し改良が必要です。
出力結果です。
↓↓クリックして頂けると励みになります。