我想将出勤记录从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'
所有这些都可能有效,但是必须有一种更好的方法来存储此数据。有人可以帮忙吗?
我还想补充一点,我希望能够从名称中访问学生的出勤记录,并检索在特定日期出现的所有学生姓名。
答案 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值的日期或一个完全格式化的记录。