如何用Python做抽獎程式

更新於 發佈於 閱讀時間約 11 分鐘

首先這是我們的抽獎名單(欄位名稱、欄位數量與內容不限,可自由調整增加)

raw-image


這是我們的獎品清單(欄位名稱需固定,內容可自由調整)

raw-image

抽獎程式如下

import pandas as pd

import random

#匯入抽獎名單

name_list = pd.read_excel("抽獎名單.xlsx")

#匯入獎品清單

prize_list = pd.read_excel("獎品清單.xlsx")

#------------------------------------------------------------

#是否可在【整場抽獎】中重複中獎(若為False則為不可重複中獎,True為可以重複中獎)

reap_winning_in_game = False

#是否可在同一【獎項類別】內重複中獎(若為False則為不可重複中獎,True為可以重複中獎)

reap_winning_in_prize_class = False

#是否可在同一【獎項名稱】內重複中獎(若為False則為不可重複中獎,True為可以重複中獎)

reap_winning_in_prize_name = False

#------------------------------------------------------------

#【整場抽獎】中獎人_list

winner_sheet_all_list = []

#【整場抽獎】中獎序號_list

winner_list_in_game = []

#【整場抽獎】中獎人_list

winner_sheet_all_list = []

#計算抽獎名單之人數

name_list_count = len(name_list)

#在每個【獎項類別】內:

for prize_class in prize_list["獎項類別"].unique():

#在該【獎項類別】中:

prize_list_ing = prize_list[prize_list["獎項類別"] == prize_class]

#在該【獎項類別】中之中獎序號_list

winner_list_in_prize_class = []

#在該【獎項類別】中,的每個獎品名稱內:

for prize_name,num_of_prizes in zip(prize_list_ing["獎項名稱"],prize_list_ing["獎項數量"]):

#在該【獎項名稱】中之中獎序號_list

winner_list_in_prize_name = []

#如果不可在【整場抽獎】內重複中獎:

if reap_winning_in_game == False:

#持續做抽獎迴圈,直到該【獎項名稱】中獎序號_list內數量=該獎品數量:

while len(winner_list_in_prize_name) < num_of_prizes:

#隨機抽出中獎序號

num = random.randint(0,name_list_count-1)

#如果抽出的序號不在【整場抽獎】中獎序號_list中,才將該序號放入該【獎項名稱】中獎序號_list

if (num not in winner_list_in_game):

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果可以在【整場抽獎】內重複:

elif reap_winning_in_game == True:

#如果不可在同一【獎項名稱】內重複 且 不可在同一【獎項類別】內重複:

if (reap_winning_in_prize_name == False and reap_winning_in_prize_class == False):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

if (num not in winner_list_in_prize_name and num not in winner_list_in_prize_class):

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果不可在同一【獎項名稱】內重複 但 可以在同一【獎項類別】內重複:

elif (reap_winning_in_prize_name == False and reap_winning_in_prize_class == True):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

if num not in winner_list_in_prize_name:

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果可以在同一【獎項名稱】內重複 但 不可在同一【獎項類別】內重複:

elif (reap_winning_in_prize_name == True and reap_winning_in_prize_class == False):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

#如果抽出的序號不在【獎項名稱】中獎序號_list中,將該序號放入【獎項名稱】中獎序號_list

if num not in winner_list_in_prize_class:

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果抽出的序號不在【獎項類別】中獎序號_list中,但已經存在在【獎項名稱】中獎序號名單中,將該序號放入【獎項名稱】中獎序號_list

elif (num in winner_list_in_prize_class and num in winner_list_in_prize_name):

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#如果可以在同一【獎項名稱】內重複 且 可以在同一獎項類別內重複:

elif (reap_winning_in_prize_name == True and reap_winning_in_prize_class == True):

while len(winner_list_in_prize_name) < num_of_prizes:

num = random.randint(0,name_list_count-1)

winner_list_in_prize_name.append(num)

winner_list_in_prize_class.append(num)

winner_list_in_game.append(num)

#建立一個list,將抽獎名單中,所有在該【獎項名稱】中獎序號_list上的人的明細資料篩選出來,並放入此list

winner_sheet_list = []

for i in winner_list_in_prize_name:

globals()[f"winner_sheet_list_{i}"] = name_list.iloc[i:i+1,:]

winner_sheet_list.append(globals()[f"winner_sheet_list_{i}"])

#將該list上之中獎人明細資料,聚合成一張該【獎項名稱】中獎人清單

globals()[f"winner_sheet_{prize_name}"] = pd.concat(winner_sheet_list,axis=0)

#將該【獎項名稱】中獎人清單加上獎品類別、獎項名稱欄位

globals()[f"winner_sheet_{prize_name}"]["獎項類別"] = prize_class

globals()[f"winner_sheet_{prize_name}"]["獎項名稱"] = prize_name

#將該【獎項名稱】中獎人清單,放入【整場抽獎】中獎人_list

winner_sheet_all_list.append(globals()[f"winner_sheet_{prize_name}"])

#將【整場抽獎】中獎人_list的所有【獎項名稱】中獎人清單,合併為全體中獎人清單

winner_sheet_all = pd.concat(winner_sheet_all_list,axis=0)

#------------------------------------------------------------

#匯出中獎名單

winner_sheet_all.to_excel("中獎名單.xlsx")

中獎名單結果如下:

raw-image


avatar-img
4會員
61內容數
我是果農,這裡有我的人資職涯經驗分享,與我菜鳥般的Python資料分析筆記,還有一些讀書心得,希望對大家有幫助。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
上次有分享一個全自動的抽獎系統,的確超級方便,但是要做出全自動抽獎是有一定的難度,需要搭配不少函數與VBA的觀念。 EXCEL全自動抽獎系統-公司尾牙、各大活動必備 全自動的抽獎系統難度較高不知該從哪裡下手,那今天就來分享一個超級簡易版的抽籤系統,看完影片或文章不用1分鐘就能自己做出來了
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
上次有分享一個全自動的抽獎系統,的確超級方便,但是要做出全自動抽獎是有一定的難度,需要搭配不少函數與VBA的觀念。 EXCEL全自動抽獎系統-公司尾牙、各大活動必備 全自動的抽獎系統難度較高不知該從哪裡下手,那今天就來分享一個超級簡易版的抽籤系統,看完影片或文章不用1分鐘就能自己做出來了