一、算法实现
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。如果有更优算法的,请在评论区或私信通知我更新,谢谢。