学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Python | 19 | 表示方法が選べる表のプログラム

<<前  [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かを判断し、それに基づいてスペースを前に入れるか、後に入れるかを決めています。


出力結果です。

hyou5.py
hyou5.py



次のプログラムを作ってみましょう。


【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を渡していきます。
これにより、ラインごとに右寄せか左寄せか違う表示になります。


実行結果です。

hyou6.py
hyou6.py



次のプログラムを作ってみましょう。


【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] )



半角英数の文字カウントがうまく合いません。
もう少し改良が必要です。


出力結果です。

hyou7.py
hyou7.py



↓↓クリックして頂けると励みになります。


<<前  [TOP]  次>>

YAE C5 CLINIC(札幌美容クリニック)

関連記事(外部サイト)