oplist.py
class Operatinglist():
def __init__(self,new_lists,old_lists):
# 已经分组list集合
self.new_lists = new_lists
# 未分组list
self.old_lists = old_lists
def has_new_list(self):
"""判断是否有未分组的list"""
return self.old_list_size() != 0
def select_list_old_list(self,list):
"""list是否在old_list集合,如果有返回index,否则返回-1"""
if list is None:
return
if list in self.old_lists :
return self.old_lists.index(list)
else:
return -1
def del_new_add_old_list(self, index):
"""将一个list分组,并从old删除返回并添加到new"""
if index is None:
return
else:
list = self.old_lists.pop(index)
self.new_lists.append(list)
return list
def add_old_lists(self, lists):
"""将一个新的list添加到未分组的list集合"""
for x in range(len(lists)):
self.old_lists.append(list[x])
def del_new_lists(self):
"""清空列表"""
self.new_lists.clear()
def new_list_size(self):
"""获取未分组的list的集合大小"""
return len(self.new_lists)
def old_list_size(self):
"""获取已经分组的list的集合大小"""
return len(self.old_lists)
opexcel.py
import xlrd
import xlwt
from xlutils.copy import copy
class Operatingexcel():
def get_excel_dic(self,filename,sheetname):
# filename 文件名
# sheetname 表单名
# 返回字典格式
dic = {}
data = xlrd.open_workbook(filename, 'r', encoding_override='utf-8')
table = data.sheet_by_name(sheetname)
for i in range(1, table.nrows):
for y in range(len(table.row_values(0))):
if table.row_values(i)[y] != "":
dic.setdefault(table.row_values(0)[y], []).append(table.row_values(i)[y])
return dic
def get_excel_list(self,filename,sheetname):
# filename 文件名
# sheetname 表单名
# 返回列表格式
list = []
data = xlrd.open_workbook(filename, 'r', encoding_override='utf-8')
table = data.sheet_by_name(sheetname)
for y in range(table.nrows):
for x in range(len(table.row_values(0))):
if table.row_values(y)[x] != "":
list.append(table.row_values(y)[x])
return list
def set_excel_dic(self,dic,filename,sheet_index,start_r):
# filename 文件名
# sheet_index第几个工作表格
# start_r那一列
x = start_r
for k in dic.keys():
list = []
list.append(k)
for v in dic[k]:
list.append(v)
self.set_excel_list(list,filename,sheet_index,x)
x = x + 1
def set_excel_list(self,list,filename,sheet_index,start_r):
# filename 文件名
# sheet_index第几个工作表格
# start_r那一列
# 读取excel文件
r_xls = xlrd.open_workbook(filename)
# 将xlrd的对象转化为xlwt的对象
excel = copy(r_xls)
table = excel.get_sheet(sheet_index)
for y in range(len(list)):
table.write(y,start_r,str(list[y]))
excel.save(filename)
自动分组随机选案.py
"""
author:魏振东
date:20200319
func:自动分组随机选案软件
齐齐哈尔地税局需要一个自动分组随机选案软件,要求:
全市有1W多家企事业单位,需要随机核查;
地税局有20人,包括3名科长,15名科员。要求随机分组,不能人指定核查单位。比如本次核查要求分3组,每组4人,科长不能在一组;
分好小组,从1W多家企事业单位中每组随机抽查5家核查;
"""
from opdata.opexcel import Operatingexcel
import random
from opgroup.oplist import Operatinglist
def sub_group(old_lists,group,s_group):
# old_lists 需要分组的列表
# group 分几组
# s_group 每组人数
# 返回字典类型
ol = Operatinglist([], old_lists,)
dic = {}
# 分成几组
for i in range(group):
h = set()
# 每组分成几个科员
while (len(h) < s_group):
# 随机产生不重复的随机数
h.add(random.randint(0, int(ol.old_list_size())))
for x in reversed(range(len(h))):
# 将x取出放入new_lists
dic.setdefault(i, []).append(ol.del_new_add_old_list(x))
return dic
if __name__ == '__main__':
# 获取工作人员以及单位数据
og = Operatingexcel()
dic_excel = og.get_excel_dic("data/地税局基本信息.xlsx", "工作人员")
list_excel = og.get_excel_list("data/地税局基本信息.xlsx", "单位")
# 输入数据
group = int(input("请输入分组数"))
num_of_lead = int(input("请输入每组科长人数"))
num_of_employ = int(input("请输入每组科员人数"))
num_of_business = int(input("请输入每组单位人数"))
# 判断
while True:
if group == 0:
group = int(input("请重新输入分组数"))
elif num_of_lead == 0 or num_of_lead * group > len(dic_excel["科长"]):
num_of_lead = int(input("请重新输入每组科长人数"))
elif num_of_employ == 0 or num_of_employ * group > len(dic_excel["科员"]):
num_of_employ = int(input("请重新输入每组科员人数"))
elif num_of_business == 0 or num_of_business * group > len(list_excel):
num_of_business = int(input("请重新输入每组单位人数"))
else:
# 分组
dic1 = sub_group(dic_excel["科长"], group, num_of_lead)
dic2 = sub_group(dic_excel["科员"], group, num_of_employ)
dic3 = sub_group(list_excel, group, num_of_business)
# 保存入文件
for i in range(group):
dic = {}
dic.setdefault("科长", dic1[i])
dic.setdefault("科员", dic2[i])
dic.setdefault("用人单位", dic3[i])
og.set_excel_dic(dic, "data/分组明细.xlsx", i, 0)
break