Python在不同优先级的人员中实现随机抽取

在这里插入图片描述

适用场景

满足办公中,人员随机指派的问题。可自定义选择的人员数量,筛选优先级

操作步骤

候选人员表制作

  1. 在Excel中,确定人员名称与对应权值(优先级)。
  2. 将表选中,粘贴到txt文件中。

代码实现思路

目标:从一个包含姓名和权重的文本文件中随机选择一定数量的人员。
主要功能:从给定的文本文件中选择一些人员,考虑了他们的权重和排序规则。它首先读取文件,然后将数据存储在字典中,并最终选择所需数量的人员进行打印输出。

  1. 导入模块:代码一开始导入了random模块,它将用于随机选择人员。

  2. txt_reader函数:用于读取文本文件,并返回文件内容作为字符串。它的输入是txt_path,表示要读取的文本文件的路径。函数尝试打开文件,如果文件存在,就读取文件内容并返回;如果文件不存在,会捕获FileNotFoundError异常,并打印相应的错误信息。

  3. txt_to_dict函数:这个函数用于将文本文件内容转换为字典。函数的输入是file_content,即文本文件的内容。它将文本内容按行分割,然后解析每行,将姓名作为键,权重作为值,构建一个字典,并返回。

  4. 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()

如果这对您有所帮助,希望点赞支持一下作者! 😊

点击查看原文

file

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值