毎日ちょっとPython ~ 9日目 ~
こんばんは。振り返りで過去の記事をさっと読み返しました。結構、色々覚えてる。いい感じ。
整形表示
pprintモジュールをプログラムにインポートすると、辞書の内容をきれいに表示できる!(pprintってややこしいなぁ)
import pprint
message = 'It was a bright cold day in April, and the clocks were striking thrteen.'
count = {}
for character in message:
count.setdefault(character,0)
count[character] = count[character] + 1
pprint.pprint(count)
プログラムを実行すると、キーもソートされていて出力がより明解になります。
{' ': 13,
',': 1,
'.': 1,
'A': 1,
'I': 1,
'a': 4,
'b': 1,
'c': 3,
'd': 3,
'e': 5,
'g': 2,
'h': 3,
'i': 5,
'k': 2,
'l': 3,
'n': 4,
'o': 2,
'p': 1,
'r': 5,
's': 3,
't': 6,
'w': 2,
'y': 1}
データ構造を用いて実世界の物体をモデル化する
まぁチェスをするみたいな感じ。代数的記法で数字と文字の座標でチェスボードのマスを記述する
チェスの駒は文字で。「K」はキング、「Q」はクイーン、「R」はルークみたいな感じ。
駒の移動を記述するには、駒を表す文字と移動先の座標を用いるイメージ。
8
7
6
5 g5
4
3
2
1
a b c d e f g h
みたいな感じですかね。「2. Nf3 Nc6」という記述は第二ターンで、白がナイトをf3に移動し、黒がナイトをc6に移動したことを表しています。
ということで三目並べを使りましょ。
三目並べのボード
まずはボードを作りましょ。
the_board = {'top-L': ' ','top-M': ' ', 'top-R': ' ',
'mid-L': ' ','mid-M': ' ', 'mid-R': ' ',
'low-L': ' ','low-M': ' ', 'low-R': ' ' }
入れる値は、スペース、o、xみたいな感じ。で、値を入れた感じにすると。
the_board = {'top-L': ' ','top-M': ' ', 'top-R': ' ',
'mid-L': ' ','mid-M': 'x', 'mid-R': ' ',
'low-L': 'o','low-M': ' ', 'low-R': ' ' }
んで、実際に三目並べのボードをコンソールに表示する関数を作ります。
the_board = {'top-L': ' ','top-M': ' ', 'top-R': ' ',
'mid-L': ' ','mid-M': ' ', 'mid-R': ' ',
'low-L': ' ','low-M': ' ', 'low-R': ' ' }
def print_board(board):
print(board['top-L'] + '|' + board['top-M'] + '|' + board['top-R'])
print('-+-+-')
print(board['mid-L'] + '|' + board['mid-M'] + '|' + board['mid-R'])
print('-+-+-')
print(board['low-L'] + '|' + board['low-M'] + '|' + board['low-R'])
print_board(the_board)
で、こんなかんじで実行すると以下のような結果になります。
| |
-+-+-
| |
-+-+-
| |
こんなかんじで。実際に値を入れてみると...
the_board = {'top-L': 'o','top-M': 'o', 'top-R': 'o',
'mid-L': ' ','mid-M': 'x', 'mid-R': ' ',
'low-L': 'x','low-M': ' ', 'low-R': ' ' }
def print_board(board):
print(board['top-L'] + '|' + board['top-M'] + '|' + board['top-R'])
print('-+-+-')
print(board['mid-L'] + '|' + board['mid-M'] + '|' + board['mid-R'])
print('-+-+-')
print(board['low-L'] + '|' + board['low-M'] + '|' + board['low-R'])
print_board(the_board)
o|o|o
-+-+-
|x|
-+-+-
x| |
みたいに表示できます。
んでんで、入力するためのコードを追記しましょ。
the_board = {'top-L': ' ','top-M': ' ', 'top-R': ' ',
'mid-L': ' ','mid-M': ' ', 'mid-R': ' ',
'low-L': ' ','low-M': ' ', 'low-R': ' ' }
def print_board(board):
print(board['top-L'] + '|' + board['top-M'] + '|' + board['top-R'])
print('-+-+-')
print(board['mid-L'] + '|' + board['mid-M'] + '|' + board['mid-R'])
print('-+-+-')
print(board['low-L'] + '|' + board['low-M'] + '|' + board['low-R'])
turn = 'x'
for i in range(9):
print_board(the_board)
print(turn + 'の番です。どこに打つ?')
move = input()
the_board[move] = turn
if turn == 'x':
turn = 'o'
else:
turn = 'x'
print_board(the_board)
みたいな感じで、ついきしました。すると以下のような感じで結果を出します。
| |
-+-+-
| |
-+-+-
| |
xの番です。どこに打つ?
top-L
x| |
-+-+-
| |
-+-+-
| |
oの番です。どこに打つ?
mid-M
x| |
-+-+-
|o|
-+-+-
| |
xの番です。どこに打つ?
mid-R
x| |
-+-+-
|o|x
-+-+-
| |
oの番です。どこに打つ?
low-L
x| |
-+-+-
|o|x
-+-+-
o| |
xの番です。どこに打つ?
top-R
x| |x
-+-+-
|o|x
-+-+-
o| |
oの番です。どこに打つ?
top-m
x| |x
-+-+-
|o|x
-+-+-
o| |
xの番です。どこに打つ?
low-R
x| |x
-+-+-
|o|x
-+-+-
o| |x
みたいな感じでできました。でもこれは完全じゃないですよね。
勝ちを定義していなかったり、値が入っている場所には入れられないようにするとかもろもろできていなかったでした。
辞書とリストの入れ子
その辞書とかリストとかを組み合わせることで、モデル化をすることをガンガンできます!
例としてはピクニックで誰が何を持ってくるかを管理するために、辞書を含む辞書を用いるプログラムを書きます
all_guests = {
'アリス':{'リンゴ':5,'プレッツェル':12},
'ボブ':{'ハムサンド':3,'リンゴ':2},
'キャロル':{'コップ':3,'アップルパイ':1}
}
def total_brought(guests,item):
num_brought = 0
for k, v in guests.items():
num_brought = num_brought + v.get(item,0)
return num_brought
print('持ち物の数:')
print('- リンゴ ' + str(total_brought(all_guests,'リンゴ')))
print('- コップ ' + str(total_brought(all_guests,'コップ')))
print('- ケーキ ' + str(total_brought(all_guests,'ケーキ')))
print('- ハムサンド ' + str(total_brought(all_guests,'ハムサンド')))
print('- アップルパイ ' + str(total_brought(all_guests,'アップルパイ')))
結果はこんな感じ
- リンゴ 7
- コップ 3
- ケーキ 0
- ハムサンド 3
- アップルパイ 1
今回はすでに用意されているものだし、わざわざこんなもの書くなんて面倒だけどこれは all_guests の値が数千人いようが結果を出力することができます。
最後に
辞書編おしまい。やっぱりべんりだねぇ。自分がかけるプログラムのアイディアにもなりそう。たのしみー