如何用python的字典和列表来实现学生成绩管理?

Python056

如何用python的字典和列表来实现学生成绩管理?,第1张

下面是一个使用 Python 的字典和列表来实现学生成绩管理的简单例子。此例子实现了所有要求,但没有使用定义学生结构体类型和数组:

# 定义学生数据字典

students = []

# 定义输入函数

def input_student():

while True:

student = {}

student['id'] = input('学号: ')

student['class'] = input('班级: ')

student['name'] = input('姓名: ')

student['scores'] = []

for i in range(3):

score = input('第%d门课程成绩: ' % (i + 1))

student['scores'].append(score)

students.append(student)

if input('是否继续输入(y/n): ') != 'y':

break

# 定义求平均分函数

def average_score():

for student in students:

total = 0

for score in student['scores']:

total += score

student['average'] = total / len(student['scores'])

# 定义求最高平均分函数

def max_average():

max_student = None

max_average = 0

for student in students:

if student['average'] >max_average:

max_student = student

max_average = student['average']

return max_student

# 调用输入函数

input_student()

# 调用求平均分函数

average_score()

# 输出每个学生的3门课程平均分

for student in students:

print('学号: %s, 班级: %s, 姓名: %s, 平均分: %.2f' % (student['id'], student['class'], student['name'], student['average']))

# 调用求最高平均分函数

max_student = max_average()

# 输出最高平均分的学生信息

if max_student:

print('\n平均分最高的学生: 学号: %s, 班级: %s, 姓名: %s, 3门课程成绩: %s, 平均分: %.2f' % (max_student['id'], max_student['class'], max_student['name'], max_student['scores'], max_student['average']))

在上面的例子中,我们定义了一个学生数据字典,用于存储学生信息。然后定义了三个函数,分别用于输入学生信息、求每个学生3门课程的平均分和求平均分最高的学生。最后,在主函数中调用这三个函数,并输出结果。

dict全称dictionary,使用键-值(key-value)存储,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

names = ['Michael', 'Bob', 'Tracy']

scores = [95, 75, 85]

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

>>>d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}

>>>d['Michael']

95

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

>>>d['Adam'] = 67

>>>d['Adam']

67

由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

>>>d['Jack'] = 90

>>>d['Jack']

90

>>>d['Jack'] = 88

>>>d['Jack']

88

如果key不存在,dict就会报错:

>>>d['Thomas']

Traceback (most recent call last):

File "", line 1, in KeyError: 'Thomas'

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

>>>'Thomas' in dFalse

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

>>>d.get('Thomas')

>>>d.get('Thomas', -1)

-1

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

>>>d.pop('Bob')

75

>>>d

{'Michael': 95, 'Tracy': 85}

创建一个空字典自需要一对大括号即可,从已有的键-值对映射或关键字参数创建字典需要使用 dict 函数(类)

把一个列表转为字典,列表的每一项都是长度为2的序列。

还可使用 关键字实参 (**kwargs)来调用这个函数,如下所示:

字典的基本操作与序列十分相似:

字典与序列的不同:

方法 clear 删除所有的字典项(key-value)。

复制,得到原字典的一个新副本。

效果等同于调用 dict(d) 创建新字典。

copy() 执行的是 浅复制 ,若字典的值是一个可变对象,那么复制以后,相同一个键将关联到同一个对象,修改该对象,将同时修改两个字典。

模块copy中的函数deepcopy 可执行深复制。

方法fromkeys 创建一个新字典,其中包含指定的键,且每个键对应的值都是None,或者可以提供一个i额默认值。

方法get 为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误,而get直接返回None,或者可设置默认返回值。

当字典中不存在指定键时, setdefault(k,v) 添加一个指定键-值对;且返回指定键所关联的值。

这三个方法返回值属于一种名为 字典视图 的特殊类型。字典视图可用于迭代。另外,还可确定其长度以及对其执行成员资格检查。

这三个方法自大的特点是不可变,当你的接口试图对其他用户提供一个只读字典,而不希望他们修改的时候,这三个方法是很有用的;而且当原字典发生改变时,这些方法返回的对象也会跟着改变。

方法 pop 可用于获取与指定键相关联的值,并将该键-值对从字典中删除。

popitem随机删除一个键-值对,并返回一个二维的元组 (key, value) ,因为字典是无序的,所以其弹出的顺序也是不确定的。

书上说,这个方法在大数据量时执行效率很高,但没有亲测。

方法update 使用一个字典中的项来更新另一个字典。