回答編集履歴

3

何度もすみません。これが最後の悩んでいることなのでよろしくお願いします。

2020/01/21 07:43

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア35865

test CHANGED
@@ -107,3 +107,29 @@
107
107
  #print('入れ替え後シフト', middleDayShift)
108
108
 
109
109
  ```
110
+
111
+
112
+
113
+ ### 何度もすみません。これが最後の悩んでいることなのでよろしくお願いします。
114
+
115
+
116
+
117
+ 個人的には、こういうのは、別質問を立ち上げた方がいいかと思います。
118
+
119
+  
120
+
121
+  
122
+
123
+ コメントに書いた通り、`random.shuffle`した後に、`key`を指定して`member[i][0]`の「能力値」だけでソートをしています。
124
+
125
+ ```python
126
+
127
+ for day in range(len(shift)): #昇順のソート(能力値の低い順)
128
+
129
+ for am_pm in range(len(shift[day])):
130
+
131
+ random.shuffle(shift[day][am_pm])
132
+
133
+ shift[day][am_pm].sort(key=lambda x:x[0])
134
+
135
+ ```

2

途中からでなくても大丈夫なのでコードを教えて

2020/01/21 07:43

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア35865

test CHANGED
@@ -57,3 +57,53 @@
57
57
  print( '入れ替え後の、その日にち、時間帯のシフト', shift[day][am_pm] )
58
58
 
59
59
  ```
60
+
61
+
62
+
63
+ ### 途中からでなくても大丈夫なのでコードを教えて
64
+
65
+
66
+
67
+ (これはいわゆる丸投げ質問なのでは……)
68
+
69
+
70
+
71
+ ```python
72
+
73
+ def swapStraightDayWorker( member, shift, lastOfStraightDay, straightDayWorker):
74
+
75
+ """
76
+
77
+ シフトは破壊的に入れ替えます。
78
+
79
+
80
+
81
+ lastOfStraightDay : int
82
+
83
+ 3連勤の最後の日
84
+
85
+ straightDayWorker : list
86
+
87
+ 3連勤した人
88
+
89
+ """
90
+
91
+ middleDay = lastOfStraightDay - 1
92
+
93
+ middleDayShift = shift[ middleDay ]
94
+
95
+ #print('入れ替え前シフト', middleDayShift)
96
+
97
+ for hourly, hourlyShift in enumerate(middleDayShift):
98
+
99
+ chosenWorker = random.choice( [ x for x in member if ( x[ 1 ][ middleDay ] == hourly or x[ 1 ][ middleDay ] == 2 ) and x not in hourlyShift ] )
100
+
101
+ if straightDayWorker in hourlyShift:
102
+
103
+ i = hourlyShift.index( straightDayWorker )
104
+
105
+ hourlyShift[i] = chosenWorker
106
+
107
+ #print('入れ替え後シフト', middleDayShift)
108
+
109
+ ```

1

社員がいませんと出た後からを具体的にコードでお願い

2020/01/17 02:52

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア35865

test CHANGED
@@ -13,3 +13,47 @@
13
13
 
14
14
 
15
15
  「時間帯で入れなかった人」については、前述同様`filter(lambda x: ( x[1][0]==0 or x[1][0]==2 ) and x[5] != y[i][j], member)`のようにして取得できると思います。
16
+
17
+
18
+
19
+
20
+
21
+ ### 社員がいませんと出た後からを具体的にコードでお願い
22
+
23
+
24
+
25
+ 仰せのままに。
26
+
27
+ ```python
28
+
29
+ for day in range(len(shift)):#社員が各日にち、時間帯に最低1人はいるかのチェック。いなかった時の入れ替えのプログラムで困っています。
30
+
31
+ for am_pm in range(len(shift[day])):
32
+
33
+ person_list = []
34
+
35
+ for i in shift[day][am_pm]:
36
+
37
+ person_list.append(i[2])
38
+
39
+ if 0 in person_list:
40
+
41
+ print('社員います', day, am_pm)
42
+
43
+ else:
44
+
45
+ print('社員いません', day, am_pm)
46
+
47
+ print( 'その日にち、時間帯で入れなかった社員', *filter( lambda x: x[2] == 0 and ( x[1][day]==am_pm or x[1][day]==2 ), member) )
48
+
49
+ print( 'ランダム', random.choice( [*filter( lambda x: x[2] == 0 and ( x[1][day]==am_pm or x[1][day]==2 ), member)] ) )
50
+
51
+ print( 'その日にち、時間帯のシフト', shift[day][am_pm] )
52
+
53
+ print( 'ランダム', shift[day][am_pm][random.randint( 0, len(shift[day][am_pm]) - 1)] )
54
+
55
+ shift[day][am_pm][random.randint( 0, len(shift[day][am_pm]) - 1)] = random.choice( [*filter( lambda x: x[2] == 0 and ( x[1][day]==am_pm or x[1][day]==2 ), member)] )
56
+
57
+ print( '入れ替え後の、その日にち、時間帯のシフト', shift[day][am_pm] )
58
+
59
+ ```