今回は辞書型リストを学んでシークレットオークションを作ってみます。
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も始めたときは辞書型リストむずかし!と思ったけど
復習して説明を記事にすると思ったよりすんなり最初から書けて
ちょっとは成長しているんだなと実感。