如何用Python做抽獎程式

閱讀時間約 14 分鐘

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

raw-image


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

raw-image

抽獎程式如下

import pandas as pd
import random

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

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

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


4會員
60內容數
我是果農,這裡有我的人資職涯經驗分享,與我菜鳥般的Python資料分析筆記,還有一些讀書心得,希望對大家有幫助。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
上次有分享一個全自動的抽獎系統,的確超級方便,但是要做出全自動抽獎是有一定的難度,需要搭配不少函數與VBA的觀念。 EXCEL全自動抽獎系統-公司尾牙、各大活動必備 全自動的抽獎系統難度較高不知該從哪裡下手,那今天就來分享一個超級簡易版的抽籤系統,看完影片或文章不用1分鐘就能自己做出來了
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
上次有分享一個全自動的抽獎系統,的確超級方便,但是要做出全自動抽獎是有一定的難度,需要搭配不少函數與VBA的觀念。 EXCEL全自動抽獎系統-公司尾牙、各大活動必備 全自動的抽獎系統難度較高不知該從哪裡下手,那今天就來分享一個超級簡易版的抽籤系統,看完影片或文章不用1分鐘就能自己做出來了