值日算法:拿取下一次的当日值日、明日值日 成员

一、算法实现

1、语言:python

2、需求:从数据库按序读取成员编号、姓名、值日状态(0:非值日、1:当天值日、2:明日值日)、在岗状态(1:正常在岗,其他均为非正常在岗)后,根据值日状态和成员在岗情况——获取排序下的下一次当日值日、明日值日的成员(注意跳过处于异常在岗状态的成员)。

3、代码如下:

"""
    根据数据库排序
    1、跳过异常状态成员
    2、拿取下一次的当日值日、明日值日 成员
"""

dutys = (('3', 'A01', '0', '1'),
 ('4', 'A02', '0', '2'),
 ('5', 'A03', '0', '1'),
 ('6', 'A04', '0', '1'),
 ('7', 'A05', '0', '1'),
 ('9', 'A06', '0', '1'),
 ('10', 'A07', '0', '1'),
 ('11', 'A08', '0', '1'),
 ('12', 'A09', '0', '1'),
 ('13', 'A10', '0', '1'),
 ('14', 'A11', '0', '2'),
 ('15', 'A12', '1', '2'),
 ('16', 'A13', '2', '2'),
 ('17', 'A14', '0', '2'),
 ('18', 'A15', '0', '2'))

max_duty = len(dutys)
max_check = 3

# 初始化变量
one_ret = False
two_ret = False

# 元组中的目标下标
next_duty_index = ''
second_duty_index = ''

# 最大轮巡三次,以拿到最优目标
for duty_id in range(max_duty * max_check):

    # duty_id处理,始终让duty_id为dutys的下标
    for i in range(max_check):
        if duty_id > max_duty - 1:
            duty_id = duty_id - max_duty
        else:
            break

    # 查找下一次的当日值日、明日值日
    if one_ret and dutys[duty_id][-1] == '1' and next_duty_index == '':
        next_duty_index = duty_id
    elif one_ret and two_ret and dutys[duty_id][-1] == '1' and next_duty_index != '':
        second_duty_index = duty_id
        break

    # 开启下一次的当日值日、明日值日 值日代取状态
    if dutys[duty_id][2] == '1':
        one_ret = True
    elif dutys[duty_id][2] == '2':
        two_ret = True

if not (one_ret and two_ret):
    print('未检测到今日、明日值日对象,所有状态回正为0')
else:
    # 当成功拿取到下一次的当日值日和明日值日id时将正常更新
    if next_duty_index != '' and second_duty_index != '':
        next_duty = dutys[next_duty_index]
        second_duty = dutys[second_duty_index]

        # 这个就是成功拿取到的目标成员姓名了
        print(next_duty[1], second_duty[1])

    # 其他情况,将所有状态回正为0,以防止误报送
    else:
        print('未成功拿取到下一次的当日值日、明日值日id,所有状态回正为0')

大家好,我是练习时长一年半的python练习生——EelBarb。如果有更优算法的,请在评论区或私信通知我更新,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值