조합가능한 모든 시간표를 내뱉어줍니다.
만든지도 오래되고 코드자체도 난해해서 잘 기억은 안나지만 잘 동작합니다.
# author Young
# sets_maker.py
# set_trial_3
"""
set_trial.py 의 결과와 동일함
sequence 알아낼 방법 찾기 ==>> 해결함
sequence 알아내는 과정에서 함수기능 지저분해짐 통일시키는 방법찾기 ==>> 해결함
"""
from sets_to_tables.tables_maker import Sort
class SetMaker(Sort):
def __init__(self):
super().__init__()
def matcher_excute(self, input_list, name_list):
"""
:param input_list: 2차원 리스트 속의 1차원 셋 총 3차원
:param name_list: 버튼 리스트
:return:
"""
# 수업 이름들 변환
for n in name_list:
if n.text():
self.name_list.append(n.text())
for n in name_list:
self.name_list += (n,)
for i in input_list:
if i:
self.input_matcher(i)
for j, seq in enumerate(self.class_seq):
self.name_time.append([])
for num, v in enumerate(seq):
for ele in input_list[num][v]:
self.name_time[j].append(f"{num}_{ele}")
for one_table_set in self.name_time:
self.time_sorted_list.append(self.sort_with_time(one_table_set)) # 리스트에 각시간별로 분류해 정리
for i in self.time_sorted_list: # 시간별로 정리된 시간표를 출력
self.table(i)
def input_matcher(self, input):
if not self.class_set: # input = first 일때 만 동작
for l, set_1 in enumerate(input):
self.class_set.append(set_1)
self.class_seq.append([l])
return
# set_temp 에 self.class_set 옮기고 self.class_set 은 초기화
set_temp = self.class_set
# seq_temp 에 self.class_seq 옮기고 self.class_seq 은 초기화
seq_temp = self.class_seq
self.reset() # self.class_set, self.class_seq 초기화
for m, temp_set in enumerate(set_temp):
for k, input_set in enumerate(input):
if temp_set.isdisjoint(input_set):
# SET
unioned_set = temp_set.union(input_set)
self.class_set.append(unioned_set)
added_seq = seq_temp[m] + [k]
self.class_seq.append(added_seq)
if __name__ == '__main__':
pass
# tables_maker.py
# 상속에대한 위계를 반대로 부여했으면 더 좋았을듯...
class Sort:
"""
set_trial 에서 출력한 data 를 table 에 올려줌
"""
def __init__(self):
# lines 리스트 내부의 리스트 갯수: 첫째줄 + N교시 = 10
# 10 교시 위해 한줄 더 추가하기
self.lines = []
self.show = ""
self.time_sorted_list = []
self.show_list = []
self.class_seq = []
self.class_set = []
self.time_sorted_list = []
self.name_time = []
self.input_list = []
self.name_list = []
def reset(self):
self.class_seq = []
self.class_set = []
def sort_with_time(self, set_1):
"""
:param set_1:
:return:
"""
list_time = []
for j in range(10):
list_time.append([])
for i in set_1:
if int(i[2:]) % 10 == 0:
list_time[0].append(i)
for i in set_1:
if int(i[2:]) % 10 == 1:
list_time[1].append(i)
for i in set_1:
if int(i[2:]) % 10 == 2:
list_time[2].append(i)
for i in set_1:
if int(i[2:]) % 10 == 3:
list_time[3].append(i)
for i in set_1:
if int(i[2:]) % 10 == 4:
list_time[4].append(i)
for i in set_1:
if int(i[2:]) % 10 == 5:
list_time[5].append(i)
for i in set_1:
if int(i[2:]) % 10 == 6:
list_time[6].append(i)
for i in set_1:
if int(i[2:]) % 10 == 7:
list_time[7].append(i)
for i in set_1:
if int(i[2:]) % 10 == 8:
list_time[8].append(i)
for i in set_1:
if int(i[2:]) % 10 == 9:
list_time[9].append(i)
return list_time
def table(self, set_3):
"""
2차원 리스트의 수업시간표를 받아서 테이블을 만들어줌.
:param set_3: 하나의 시간표 (2차원 리스트)
:return: ...
"""
# 한글 시간표 출력
if ord('가') <= ord(self.name_list[0][0]) <= ord('힣'):
dash = "{0:^12}".format('-')
first_line = " {0:^12}{1:^12}{2:^12}{3:^12}{4:^12}".format('mon', 'tue', 'wed', 'thu', 'fri')
self.lines.append(str(first_line))
for j in range(10):
a, b, c, d, e = dash, dash, dash, dash, dash
for i in set_3[j]:
name = self.name_list[int(i[0])][:5]
length = len(name)
space = name.count(' ')
x = 12 - length + space
if int(i[2:]) // 10 == 0:
a = f"{name}"
if int(i[2:]) // 10 == 1:
b = f"{name}"
if int(i[2:]) // 10 == 2:
c = f"{name}"
if int(i[2:]) // 10 == 3:
d = f"{name}"
if int(i[2:]) // 10 == 4:
e = f"{name}"
class_line = "({0:^3}){1}{2}{3}{4}{5}".format(j + 1, a.center(x),
b.center(x), c.center(x), d.center(x), e.center(x))
self.lines.append(str(class_line))
for i in range(11):
self.show += str(self.lines[i]) + '\n'
# 영어시간표 출력
elif ord('a') <= ord(self.name_list[0][0].lower()) <= ord('z'):
dash = "{0:^11}".format('-')
first_line = " {0:^11}{1:^11}{2:^11}{3:^11}{4:^11}".format('mon', 'tue', 'wed', 'thu', 'fri')
self.lines.append(str(first_line))
for j in range(10):
a, b, c, d, e = dash, dash, dash, dash, dash
for i in set_3[j]:
name = self.name_list[int(i[0])][:9]
if int(i[2:]) // 10 == 0:
a = f"{name}"
if int(i[2:]) // 10 == 1:
b = f"{name}"
if int(i[2:]) // 10 == 2:
c = f"{name}"
if int(i[2:]) // 10 == 3:
d = f"{name}"
if int(i[2:]) // 10 == 4:
e = f"{name}"
class_line = "({0:^3}){1:^11}{2:^11}{3:^11}{4:^11}{5:^11}".format(j + 1, a, b, c, d, e)
self.lines.append(str(class_line))
for i in range(11):
self.show += str(self.lines[i]) + '\n'
show = ""
for i in range(10):
show += str(self.lines[i]) + '\n'
self.show_list.append(show) #
if __name__ == '__main__':
pass
전체 코드 및 다운로드는 여기서
https://github.com/ltyiz07/project_timetable