满足办公中,人员随机指派的问题。可自定义选择的人员数量,筛选优先级
目标:从一个包含姓名和权重的文本文件中随机选择一定数量的人员。
主要功能:从给定的文本文件中选择一些人员,考虑了他们的权重和排序规则。它首先读取文件,然后将数据存储在字典中,并最终选择所需数量的人员进行打印输出。
导入模块:代码一开始导入了random
模块,它将用于随机选择人员。
txt_reader
函数:用于读取文本文件,并返回文件内容作为字符串。它的输入是txt_path
,表示要读取的文本文件的路径。函数尝试打开文件,如果文件存在,就读取文件内容并返回;如果文件不存在,会捕获FileNotFoundError
异常,并打印相应的错误信息。
txt_to_dict
函数:这个函数用于将文本文件内容转换为字典。函数的输入是file_content
,即文本文件的内容。它将文本内容按行分割,然后解析每行,将姓名作为键,权重作为值,构建一个字典,并返回。
members_select
函数:这个函数用于按照权重、人员数量和排序规则来挑选人员。它的输入包括member_dict
(包含姓名和权重的字典)、desired_count
(需要挑选的人员数量)、和可选参数if_ascending
(排序规则,默认为0,表示优先选择权重小的人员)。
selected_members
。grouped_members
,其中键是权重,值是具有相同权重的成员列表。# -*- coding:utf-8 -*-
"""
作者:ThsPool
简介:读取包含姓名与权重的txt文件,随机选取任意数量的人员。(可选项:权重排序规则;候选人员数量)
"""
import random
def txt_reader(txt_path):
"""
读取txt文件为列表
:param txt_path: 读取txt文件所在位置
:return: 返回txt文件列表
"""
# 打开文件并读取内容
member_file = txt_path
try:
with open(member_file, "r", encoding='utf-8') as file:
file_content = file.read()
print('成员文件读取正常:', txt_path.split('/')[-1])
return file_content
except FileNotFoundError:
print(f"文件 {member_file} 不存在。")
except Exception as e:
print(f"发生错误:{str(e)}")
def txt_to_dict(file_content):
"""
读取txt列表为dict
:param file_content: 读取的txt文件列表
:return: 返回字典
"""
# 将数据转化为字典
member_dict = {}
lines = file_content.strip().split('\n')
for line in lines:
parts = line.split()
if len(parts) == 2:
name, value = parts[0], int(parts[1])
member_dict[name] = value
return member_dict
def members_select(member_dict, desired_count, if_ascending=0):
"""
按照权值、人员数量、排序规则挑选人员
:param member_dict: 成员字典
:param desired_count: 需要挑选的人员数量
:param if_ascending: 可选 0-优先权值小的;1-优先权值大的
:return: 返回候选成员列表
"""
selected_members = [] # 初始化候选者列表
# 将成员按权重分组
grouped_members = {}
for member, weight in member_dict.items():
if weight not in grouped_members:
grouped_members[weight] = []
grouped_members[weight].append(member)
# 确定权重排序升降序
if if_ascending == 0:
sorted_list = sorted(grouped_members.keys())
print('排序规则: 优先选择权重小的人员')
else:
sorted_list = sorted(grouped_members.keys(), reverse=True)
print('排序规则: 优先选择权重大的人员')
# 先从首发组选
for weight in sorted_list:
candidates = grouped_members[weight]
random.shuffle(candidates) # 随机打乱同一权重组内的顺序
selected_members.extend(candidates[:desired_count - len(selected_members)])
if len(selected_members) >= desired_count:
break
# 如果数量不够,从其他的组选
if len(selected_members) < desired_count:
remaining_candidates = [member for members in grouped_members.values() for member in members]
random.shuffle(remaining_candidates) # 打乱所有剩余候选人
selected_members.extend(remaining_candidates[:desired_count - len(selected_members)])
return selected_members
def main():
# 读取人员txt文件
txt_content = txt_reader(txt_path="./member_list.txt")
# 将人员列表转为字典
member_content = txt_to_dict(file_content=txt_content)
# 按照权值、人员数量、排序规则挑选人员:0-升序;1-降序
list_selected = members_select(member_dict=member_content, desired_count=3, if_ascending=0)
# 打印筛选结果
print("随机选择的成员名称:", list_selected)
if __name__ == '__main__':
main()
如果这对您有所帮助,希望点赞支持一下作者!
点击查看原文