UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY:9 辞書型リストを使って簡易シークレットオークションをプログラムする!

今回は辞書型リストを学んでシークレットオークションを作ってみます。

UdemyのAngela Yu先生のコースは毎回何かを作りながら学ぶので

面白いし作ったもので遊べるのがとてもいい。

 

さて辞書型リストについて。

 

今まで習ったリストは[0, 1, 2, [3,4]]などの1つ、または複数に入れ子にした変数を入れられるものだけだったけど、

辞書型のリストというのもある。書き方は

jisho = { "sensei" : "Angela Yu", "student" : me }

 

こんな感じ。

例えばAngela Yuのデータを取得したい場合は

name = jisho["sensei"]

print(name)

 

これで出せる。

 

このリストに新しいデータを追加したい場合は、

jisho["new_student"] = "you"

で追加ができる。

 

 

今回作るシークレットオークションについて説明すると、

ヤフオクとかだと最初は1円で、そこからいろんな人が値段を買値を上げていって、

一番高い値段を見て自分が値段を上げるか諦めるかわかる。

最終的に一番高い人が購入できるというものだけど

 

シークレットの場合はそうじゃなくて、

それぞれに参加したい人と値段を司会の人が聞いて、

一番高く値段を出した人だけがみんなに知らされる感じ。

他の人の値段とかはまったくわからない。

 

そういうもの。流れでいうと

・参加者の名前と、買値を聞いて、リストに登録する。

・他にも参加者がいるか聞く。

・いれば参加者の名前と買値を聞いてリストに追加する。

・いなければそのリストの中から1番高い人を知らせる。

 

こんな感じ。

 

pythonでプログラムすると、

まずオークションリストを作る。

auction_list = {}

 

参加者の名前と、買値を聞いて、このリストに登録する。

これはfunction化してみる。

def new_bid():
name = input("What's your name? : ")
price = input("How much will you bid? : $")
auction_list[name] = int(price)

 

ソースコピペしたらこんなんなった!今回からこれでいこう

 

で、参加者がいなくなるまで続ける。

whileを使うとよさそう。

is_finished = False
while not is_finished:
new_bid()
finish_q = input("Will you finish? Y/N").lower()
if finish_q == "y":
is_finished = True

 

参加者がいなくなったら、最後にどの人が勝ちかを判定する。

これもファンクション化して、最初に買った人の値段と名前を定義してから、

for文でオークションリストのデータを登録された分を見ていく。

前の人より金額が多かったらその人が勝ち、

勝ちの人より次の人の金額が多かったら勝ちが入れ替わる。

そんな流れで、終わったら「あなたが勝ち!金額は●●です!おめでとう!」

というような発表をする、という流れ。

 

def winner_is():
winner_price = 0
winner = ""
for bidder in auction_list:
bid_price = auction_list[bidder]
if winner_price < bid_price:
winner_price = bid_price
winner = bidder
print(f"The winner is {winner} and price is ${winner_price}! Congratulation!")

winner_is()

 

DAY9も始めたときは辞書型リストむずかし!と思ったけど

復習して説明を記事にすると思ったよりすんなり最初から書けて

ちょっとは成長しているんだなと実感。