基于值移动列表元素位置

2024-09-29 23:21:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为教职员工和学生创建一个基于网络的学校时间表视图。我使用django1.8将其输出到一个表中,如果这有什么不同的话。你知道吗

示例学生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个lessons/NULL。你知道吗

我想做的事可能吗?你知道吗


Tags: 文件csvin列表forif时间表学生
1条回答
网友
1楼 · 发布于 2024-09-29 23:21:33

看看你的示例数据,看起来数据将按TeacherCode,DayNo,PeriodNo排序,所以我的解决方案也是这样。你知道吗

为了简化,首先过滤reader数据结构,使其仅包含相关行。你知道吗

使用2个for循环在每天和时间段上循环。如果有相应的行,请将该行添加到明细表中。如果没有,请创建一个带有适当空格的新字典,并将其添加到计划中。你知道吗

我没有在返回时编译列表,而是使用一个列表来附加一天的所有时间段,然后在每天之后将该列表附加到完整的时间表中。你知道吗

代码如下:

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)

如果有更好的方法遍历数据,请告诉我。你知道吗

相关问题 更多 >

    热门问题