存储考勤数据的最有效或最有用的方法是什么?

时间:2018-08-28 10:18:21

标签: python

我想将出勤记录从excel表格移到python,但是我不确定存储该数据的最佳方法是什么。

方法1 创建一个字典,将学生姓名作为关键字,并将他们参加的日期作为列表中的项目。也许列出他们缺席的日子会更有效率。

attendance = {}
attendance["student_1"] = [2018-08-10, 2018-08-15, 2018-08-20]

方法2 创建日期字典并添加当天出席的学生列表:

attendance = {}
attendance["2018-08-10"] = [student_1, student_2, student_3]

方法3 创建嵌套字典。学生将名称作为外键。所有日期均为内部键,布尔值为值。

attendance = {}
attendance["student_1"]= {}
attendance["student_1"]["1018-08-10"] = 'True'

所有这些都可能有效,但是必须有一种更好的方法来存储此数据。有人可以帮忙吗?

我还想补充一点,我希望能够从名称中访问学生的出勤记录,并检索在特定日期出现的所有学生姓名。

3 个答案:

答案 0 :(得分:2)

这完全取决于您的用例。每种方法都有其自身的优势。

方法1

attendance = {}
attendance["student_1"] = [2018-08-10, 2018-08-15, 2018-08-20]
total_days_present_student_1 = len(attendance["student_1"])

您具有轻松获得“不”的优势。学生在场的日子

方法2

attendance = {}
attendance["2018-08-10"] = [student_1, student_2, student_3]
total_student_present_on_2018_08_10 = len(attendance["2018-08-10"])

您具有获得总数的优势。某一天的学生人数

方法3

attendance = {}
attendance["student_1"]= {}
attendance["student_1"]["1018-08-10"] = 'True'

其他两种方法所提供的并不是什么特别的优势

答案 1 :(得分:1)

  

我想将出勤记录从excel表格移到python,但是我不确定存储该数据的最佳方法是什么。

实际上,您发布的示例都不是关于存储数据的(在程序执行之间保留它们)。程序执行过程中,您在执行过程中对attendance字典所做的更新将丢失,并且我严重怀疑您是否希望程序用户编辑python代码以添加或更改数据。

长话短说,这类程序需要一个SQL数据库-不仅可以保存数据,还可以更轻松地查询很多

答案 2 :(得分:1)

我不确定您是否已经研究过OOP(面向对象编程),但是如果您将来需要存储的不仅仅是出勤,则这种方法可能很有用。参见我的“基本”示例:

设置对象

students = []

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.attendance = {}

def add_attendance(date, students, values):
    for student, val in zip(students, values):
        student.attendance[date] = val

设置学生

这部分可以通过从带有学生数据的文本文件中读取来完成,但是为了简洁起见,我在这里进行了简化。

students = [
    Student('Bob', 15),
    Student('Sam', 14)
    ]

添加一天并记录出勤情况

再次,我在这里对日期进行了硬编码,但这显然是来自外部来源; datetime模块在​​这里可能很有用。

current_date = '27-08-2018'

attendance_values = [
    True,    # for Student(Bob)
    False    # for Student(Sam)
    ]

add_attendance(current_date,
               students,
               attendance_values)

现在,我将添加第二天(用于演示的硬编码):

current_date = '28-08-2018'
attendance_values = [True, True]
add_attendance(current_date, students, attendance_values)

显示信息

我可以轻松显示all信息:

>>> print('\n'.join([str(s.attendance)
...                  for s in students]))
{'27-08-2018': True, '28-08-2018': True}
{'27-08-2018': False, '28-08-2018': True}

或者,以一种更加“友好”的方式,并使用每个学生的姓名:

>>> print('data for 27-08-2018:')
>>> for student in students:
...    print('{:>10}: {}'.format(student.name,
...                              student.attendance['27-08-2018']))

data for 27-08-2018:
       Bob: True
       Sam: False

外部存储

当前,所有数据将在程序终止时丢失,因此可能的文本文件结构如下。

学生:

Bob      15
Sam      14   # more data fields in columns here

出勤:

27-08-2018
Bob            True    # or anything else to signify they were present
Sam            False

28-08-2018
Bob            True
Sam            True

现在,您可以逐行读取每个文件,对于“学生”文件按空格分割,但是对于“出勤”文件,无疑将更加困难。这完全取决于您在出勤文件中包含的数据:它可能只是一个带有True / False值的日期或一个完全格式化的记录。