2015-09-29 4 views
3

Я пытаюсь создать веб-представление расписания наших школ для персонала и студентов. Я использую Django 1.8 для вывода этого на таблицу, если это имеет значение.Переместить элемент списка элементов, основанный на значениях

Sample Student CSV файла: http://pastebin.com/Jf8My0RH Образец CSV Учитель файла: http://pastebin.com/ie3qeT3R

Все данные хранятся в нескольких файлах CSV. У меня есть студенческие расписания работают отлично, используя код ниже:

def get_timetable(StudentCode): 
    timetable = [] 

    with open(TT_BASE_DIR + 'NStudTT.txt') as student_timetable: 
     reader = csv.DictReader(student_timetable, fieldnames=("StudentName","StudentCode","DayNo","PeriodNo","ClassCode","TeacherCode","RoomCode","RollClassCode","LessonType")) 

    for row in reader: 
     if row['StudentCode'] == StudentCode: 
      for day in range(11): 
       if int(row['DayNo']) == day: 
        timetable.append(row) 

return(timetable[x:x+10] for x in range(0, len(timetable),10)) 

Это возвращает список из 10 списков, каждый из которых имеет 10 словарных статьи, которые я могу вывод в таблицу.

Я хочу сделать то же самое для учителей, однако у них не всегда есть полное расписание. Это код, я использую, чтобы получить данные из файла CSV:

def get_teacher_timetable(TeacherCode): 

    timetable = [] 

    with open(TT_BASE_DIR + 'NTRTimeT.txt') as teacher_timetable: 
     reader = csv.DictReader(teacher_timetable, fieldnames=("TeacherCode", "RoomCode", "DayNo", "PeriodNo", "RollClassCode", "ClassCode")) 

    for row in reader: 
     if row['TeacherCode'] == TeacherCode: 
      for day in range(11): 
       if int(row['DayNo']) == day: 
        timetable.append(row) 
    return(temp_timetable) 

я могу получить его, чтобы вернуть все элементы в одном списке словарей. То, что мне нужно, это группировать словари на DayNo, а затем вставлять каждую группу в новый список. Однако я хочу вставить записи в список в соответствии с PeriodNo. Поэтому, если в периоде 4 был запасной, он создавал бы элемент NULL или «» и т. Д. В конце я должен был иметь список из 10 списков с 10 уроками/нулями в каждом.

Является ли это тем, что я хочу сделать возможным?

ответ

1

Рассматривая данные образца, похоже, что данные будут отсортированы по TeacherCode, DayNo, PeriodNo, поэтому мое решение аналогично.

Чтобы упростить, сначала фильтруйте структуру данных reader так, чтобы она содержала только соответствующие строки.

Используйте 2 для циклических циклов для каждого дня и временного интервала. Если есть соответствующая строка, добавьте эту строку в расписание. Если этого не произошло, создайте новый словарь с соответствующими пробелами и добавьте его в расписание.

Вместо того, чтобы компилировать список списков при возврате, я использовал список для добавления всех временных интервалов на один день, а затем добавил этот список к полному расписанию после каждого дня.

Вот код:

def get_teacher_timetable(TeacherCode): 

    timetable = [] 

    with open(TT_BASE_DIR + 'NTRTimeT.txt') as teacher_timetable: 
     reader = csv.DictReader(teacher_timetable, fieldnames=("TeacherCode", "RoomCode", "DayNo", "PeriodNo", "RollClassCode", "ClassCode")) 

    rows = iter([row for row in reader if row['TeacherCode'] == TeacherCode]) 
    row = next(rows,None) 

    for day in range(1,11): 
     day_schedule = [] 
     for period in range(1,11): 
      if row and int(row['DayNo']) == day and int(row['PeriodNo']) == period: 
       day_schedule.append(row) 
       row = next(rows,None) 
      else: 
       new_row = {"TeacherCode":TeacherCode, "RoomCode":"", "DayNo":day, "PeriodNo":period, "RollClassCode":"", "ClassCode":""} 
       day_schedule.append(new_row) 
     timetable.append(day_schedule) 

    return(timetable) 

Если есть лучший способ для перебора данных, пожалуйста, дайте мне знать.

+1

Спасибо, кучи. Это именно то, что мне нужно. –

Смежные вопросы