1. 程式人生 > 其它 >python-實現不放回抽籤

python-實現不放回抽籤

需求:1.不放回抽籤 2.把名單上的人員都抽取完以後才能開始下一輪 3.每次打分數都累加 4.可以檢視前三和後三名

使用excel實現:思路就是先拿到名單資料,然後抽籤(判斷抽出來的人在不在新list中),打分,排序。使用遞迴呼叫實現多次抽取。

import xlrd
import random
import sys
from openpyxl import load_workbook

filename = '參訓人員名單.xlsx'
name_new_list = []

def open_excel():
    xl = xlrd.open_workbook(filename)
    sheet 
= xl.sheet_by_index(0) return sheet def read_name(): sheet = open_excel() row_num = sheet.nrows# 獲取excel中有多少行 name_score = [] for i in range(1,row_num): value = sheet.row_values(i)#取出每一行的名字和分數 name_score.append(value) new_name_score = dict(name_score) #返回姓名分數列表
return new_name_score def draw_people(): names = read_name() # 獲取姓名分數字典 name_list = list(names.keys()) # 把姓名拿出來,當一個列表,用來抽取 if len(name_new_list) == len(name_list):# 如果原始列表和存放抽取名字的列表相等,清空存放名字列表 nu = input('名單上的人員都已被抽過!開啟新一輪的抽籤請輸入1\n 返回上級選單請輸入2\n') if nu == '1': name_new_list.clear()
else: return #返回主選單 people_name = random.choice(name_list) if people_name not in name_new_list: name_new_list.append(people_name) name_num = name_list.index(people_name)+2 # 獲取序號+2,因為下標從0開始, print('此次抽中的人員是:',people_name) mark_score(name_num) else: draw_people() def mark_score(people_num): wb = load_workbook(filename) wb1 = wb.active # 啟用sheet old_score = wb1.cell(row = people_num,column = 2).value #取出原始分數
   print("該人員的現有分數是:",old_score) this_score = input("請給抽中的人員打分數:") now_score = int(old_score) + int(this_score) wb1.cell(people_num,2,now_score)#寫入分數列 wb.save(filename) # 儲存 def sort_score(): #排序 all_score = read_name()#拿到姓名和分陣列成的字典 desc = sorted(all_score.items(),key=lambda x:x[1], reverse=False)[:3]#倒序排,輸出前三 asc = sorted(all_score.items(),key=lambda x:x[1], reverse=True)[:3]#正序排,輸出前三 print("排名前三的人員:",asc) print("排名後三的人員:",desc) def main(): num = input("---抽籤,請輸入1\n---檢視排名,請輸入2\n---退出程式,請輸入3\n") if num == '1' : draw_people() main() elif num == '2': sort_score() main() else: sys.exit(0) if __name__ == '__main__': main()