前提・実現したいこと
現在、シフト作成のプログラムを作成しています。
【手順】
・日にち、時間帯ごとにシフト希望をリスト化
・それを能力値順にソート
・ソートされたリストから必要人数分取る。(その際取られなかった人のリストを作っておく)
・各シフトに社員が最低1人いない場合、その日にち、時間帯で入れなかった社員をランダムで選んで、入っている人のランダムで入れ替える
・3連勤している人がいた場合、3連勤の真ん中の日にちをその日にち、時間帯で入れなかった人のランダムと入れ替える
このような手順なのですが、最後の2つが途中まででつまずいています。
該当のソースコード
Python
1#従業員=["能力値","シフト希望時間","役職","休む度合い","対応度合い","名前"] 2#役職=["社員","アルバイト"] 3#役職=[0,1] 4#シフト希望時間=[11:00-17:00,17:00-22:00,11:00-22:00,"希望無し"] 5#シフト希望時間=[0,1,2,9] 6 7#aは社員 8a=[5,[2,9,2,2,2],0,1,3,"a"] 9#bは社員 10b=[3,[2,2,2,9,2],0,1,3,"b"] 11#cは主婦 12c=[3,[0,0,0,0,9],1,2,1,"c"] 13#dはフリーター 14d=[4,[2,2,2,9,1],1,2,2,"d"] 15#eは大学生(夕方) 16e=[1,[1,1,9,1,1],1,1,3,"e"] 17#fは大学生(朝) 18f=[2,[9,2,9,2,0],1,1,2,"f"] 19 20member=[a,b,c,d,e,f] 21 22shift = [] 23gozen = [] 24gogo = [] 25 26for i in range(len(member[1][1])): 27 for j in member: 28 if j[1][i] == 0: 29 gozen.append(j) 30 elif j[1][i] == 1: 31 gogo.append(j) 32 elif j[1][i] == 2: 33 gozen.append(j) 34 gogo.append(j) 35 shift.append([gozen, gogo]) 36 gozen = [] 37 gogo = [] 38 39print(shift[0][0]) #1日目の午前の希望 40print(shift[0][1]) #1日目の午後の希望 41print(shift[1][0]) #2日目の午前の希望 42print(shift[1][1]) #2日目の午後の希望 43print(shift[2][0]) #3日目の午前の希望 44print(shift[2][1]) #3日目の午後の希望 45print(shift[3][0]) #4日目の午前の希望 46print(shift[3][1]) #4日目の午後の希望 47print(shift[4][0]) #5日目の午前の希望 48print(shift[4][1]) #5日目の午後の希望 49print(".............................................") 50 51 52#必要人数 53#1日目=[午前の必要人数,午後の必要人数] 54d1=[3,3] 55d2=[2,3] 56d3=[3,2] 57d4=[2,2] 58d5=[2,3] 59 60date=[d1,d2,d3,d4,d5] 61 62 63for day in range(len(shift)): #昇順のソート(能力値の低い順) 64 for am_pm in range(len(shift[day])): 65 shift[day][am_pm].sort() 66 print (shift[day][am_pm]) 67 68print(".............................................") 69 70 71p=[] 72q=[] 73r=[] 74for day in range(len(shift)): #必要人数分取って入れなかった人を別のリストに入れる 75 for am_pm in range(len(shift[day])): 76 for i in range(len(shift[day][am_pm])-date[day][am_pm]): 77 p.append(shift[day][am_pm][i]) 78 shift[day][am_pm].remove(shift[day][am_pm][i]) 79 print (shift[day][am_pm]) 80 q.extend([p]) 81 p=[] 82 r.extend([q]) 83 q=[] 84print (r) 85print(".............................................") 86 87 88x=[] #3連勤チェックは時間帯に関係なく日ごとなので、日ごとの午前、午後を一つにまとめる作業 89y=[] 90for day in range(len(shift)): 91 for am_pm in range(len(shift[day])): 92 for i in range(len(shift[day][am_pm])): 93 x.append(shift[day][am_pm][i][5]) 94 y.extend([x]) 95 x = [] 96 97for i in range(len(y)): 98 y[i] = list(set(y[i])) 99 100print(y) 101print(".............................................") 102 103 104for i in range(3): #3連勤している人の入れ替えのプログラム。途中の入れ替えからが困っています。 105 for j in range(len(y[i])): 106 if y[i+1][j] in y[i]: 107 if y[i+1][j] in y[i+2]: 108 if shift[i+1][j] in shift[i+1]: 109 shift[i+1].append 110 111 112 113for day in range(len(shift)): #社員が各日にち、時間帯に最低1人はいるかのチェック。いなかった時の入れ替えのプログラムで困っています。 114 for am_pm in range(len(shift[day])): 115 person_list = [] 116 for i in shift[day][am_pm]: 117 person_list.append(i[2]) 118 if 0 in person_list: 119 print('社員います') 120 else: 121 print('社員いません') 122
発生している問題・エラーメッセージ
・各シフトに社員が最低1人いない場合、その日にち、時間帯で入れなかった社員をランダムで選んで、入っている人のランダムで入れ替える ・3連勤している人がいた場合、3連勤の真ん中の日にちをその日にち、時間帯で入れなかった人のランダムと入れ替える この2つのプログラムの「各シフトに社員が最低1人いない場合」、「3連勤している人がいた場合」まではできたのですが「その日にち、時間帯で入れなかった社員をランダムで選んで、入っている人のランダムで入れ替える」と「3連勤の真ん中の日にちをその日にち、時間帯で入れなかった人のランダムと入れ替える」のプログラムがわからないです。
「各シフトに社員が最低1人いない場合、その日にち、時間帯で入れなかった社員をランダムで選んで、入っている人のランダムで入れ替える」とのことですが、ここまで決まっているならコードになりませんか?
どの部分がわからないのでしょうか?
たとえば、「各シフトに社員が最低1人いない場合」がコードにできない、などと具体的にわからない部分を記載した方が回答がつくかもしれません。
何ができていて、何ができていないのか(何がわかっていて、何がわからないのか)を書きましょう
https://teratail.com/help/question-tips#questionTips3-5-2
回答4件
あなたの回答
tips
プレビュー