当前位置:   article > 正文

Python在不同优先级的人员中实现随机抽取_排队选人python

排队选人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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/488668
推荐阅读
相关标签