第五期 数据之美与数据结构

  1. 讲师:李浩然
  2. (在本次课中,”项“和”元素“有着相同的意义)

1. 列表 (list)

1.1 列表的基本形式与创建

  1. students_all = [81, 94, 92, 71, 99, ……, 87] # 可以都是整数
  2. students_none = [] # 可以没有任何元素在内
  3. student_names = [‘Edward’, Ben’, ……, Tom’] # 可以都是字符串
  4. student_heights = [1.75, 1.88, 1.62, ……, 1.73] # 可以都是浮点数(小数)
  5. student_info = [‘Edward’, 19, University of Toronto’] # 可以什么都有
  6. student_combine = [[1, 2], 3] # 甚至可以将列表作为元素

1.2 索引 (index)

  1. >>> ls = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']
  2. >>> ls[0] # 打印字符串格式的元素
  3. 'foo'
  4. >>> ls[0] == foo # 比较元素和字符串
  5. True
  6. >>> ls[-6] == ls[0] # 从尾部计数与从头部计数有相同意义
  7. True
  8. >>> ls[0] + ls[1] # 列表里的字符串元素可以当做字符串变量来处理
  9. foobar
  10. >>> ls_1 = [1, 2, 3, 4, 5]
  11. >>> ls_1[0] + ls_1[1] # 列表里的数字元素可以当做数字变量来处理
  12. 3
  13. >>> ls_1[1] * ls_1[2] # 列表里的数字元素可以当做数字变量来处理
  14. 6
小练习 1
  1. >>> ls = [81, 94, 92, 71, 99, 87]
  2. >>> print(’列表 ls 所有元素的平均数是多少?’)
  3. 列表 ls 所有元素的平均数是多少?
  4. >>>
  1. >>> ls = [‘foo’, bar’, baz’, qux’, quux’, corge’]
  2. >>>
  3. >>> ls[1:2]
  4. ['bar']
  5. >>> ls[0:-3] # 从第 0 项到第 -4 项
  6. [‘foo’, bar’, baz’]
  7. >>> ls[-4:] # 从第 -4 项到列表末尾
  8. [‘baz’, qux’, quux’, corge’]
  9. >>> ls[:] # 从列表开头到列表末尾
  10. [‘foo’, bar’, baz’, qux’, quux’, corge’]
小练习 2
  1. >>> ls = [‘foo’, bar’, baz’, qux’, quux’, corge’]
  2. >>> ls[-5:4]
  3. >>> ls[:-2]
  4. >>> ls[5:2]

1.3 值的操作

  1. >>> ls = [81, 94, 92, 71, 99, 87, 92]
  2. >>> ls[0] = 90 # 列表中的项可以通过赋值号修改值
  3. >>> ls
  4. [90, 94, 92, 71, 99, 87, 92]
  5. >>>
  6. >>> 99 in ls # 可以用关键字 'in' 来验证列表中是否包含某项
  7. True
  8. >>> 100 in ls
  9. False

1.4 常用方法

1.4.1 len, min, max, sum

  1. >>> ls = [81, 94, 92, 71, 99, 87, 92]
  2. >>> len(ls) # 项的个数
  3. 7
  4. >>> min(ls) # 求最小值
  5. 71
  6. >>> max(ls) # 求最大值
  7. 99
  8. >>> sum(ls) # 求和
  9. 616
小练习 3
  1. >>> ls = [81, 94, 92, 71, 99, 87]
  2. >>> print(’列表 ls 所有元素的平均数是多少?’)
  3. 列表 ls 所有元素的平均数是多少?
  4. >>>

1.4.2 append, remove

  1. >>> ls = [81, 94, 92, 71, 99, 87, 92]
  2. >>> ls.append(92) # 在列表末尾添加一个项
  3. >>> ls
  4. [81, 94, 92, 71, 99, 87, 92, 92]
  5. >>> ls.remove(92) # 删去第一个出现的匹配项
  6. >>> ls
  7. [81, 94, 71, 99, 87, 92, 92]
  8. >>> ls.remove(100) # 删去一个不存在的值会得到错误
  9. Error!

1.4.3 index, count, reverse

  1. >>> ls = [81, 94, 92, 71, 99, 87, 92]
  2. >>> ls.index(92) # 显示第一个匹配的项的索引
  3. 2
  4. >>> ls.index(100) # 查找一个不存在的值会得到错误
  5. Error!
  6. >>> ls.count(92) # 数一数这个值在列表里出现了几次
  7. 2
  8. >>> ls.reverse() # 将列表反转
  9. >>> ls
  10. [92, 87, 99, 71, 92, 94, 81]

2. 元组 (tuple)

2.1 元组的形式与创建

  1. >>> seq_1 = (81, 94, 92, 71, 99, 87, 92) # 元组的项可以为数字
  2. >>> seq_2 = () # 元组可以为空
  3. >>> seq_3 = ('Edward', 'is', 'handsome') # 元组的项可以为字符串
  4. >>> seq_4 = ((0, 0), (1, 1)) # 元组的项可以为元组
  5. >>> seq_5 = ([1, 2], 3) # 元组的项可以为列表

课外内容(不懂没关系):在元组内的列表的值是可以进行修改的。这是因为在元组中,列表的储存形式为内存地址,并非真正的值。在改变元组中的列表的值的时候,并没有改变在元组中的内存地址,从而使元组中的值依然是未改变的。(如果想明白的更透彻一点可以来找我)

2.2 元组的非法用法

  1. >>> seq.append(92) # 不可以添加项
  2. Error!
  3. >>> seq.remove(92) # 不可以删除项
  4. Error!
  5. >>> seq[0] = 100 # 不可以修改值
  6. Error!

2.3 元组的意义

3. 字典 (dictionary)

3.1 字典的形式与创建

  1. >>> dic_1 = { 882673: 100, 882674: 82, 882675: 93 }
  2. >>> dic_2 = { Edward’: 100, Shawn’: 49 }
  3. >>> dic_3 = { Edward’: University of Toronto’,
  4. Shawn’: Western University’,
  5. Kate’: Peking University }

注意:对于字典,我们需要注意的是,它的每一个项的键都是不可更改的。也就是说,当一个键一旦声明,就不可以再改变。若想改变,只能删除再添加。

同时,虽说字典的项的值可以是任何形式,但是字典的项的键却不可是列表,因为列表是可以被更改的。比如说:dic = { [ 1, 2, 3 ]: ‘Edward’}是非法的。

假若在创造一个字典的时候,相同的键出现了两次,那只有最后一次是有效的。

3.2 值的操作

  1. >>> dic = { a’: 1, b’: 2, c’: 3, d’: 4 }
  2. >>> dic[‘a’] # 访问字典里的值
  3. 1
  4. >>> dic[‘a’] = 2 # 修改字典里的值
  5. >>> dic
  6. { a’: 2, b’: 2, c’: 3, d’: 4 }
  7. >>> del dic[‘b’] # 删除字典里的值
  8. >>> dic
  9. { a’: 2, c’: 3, d’: 4 }
小练习 4

将如下表格以字典的形式表达出来。提示:列表也可以作为字典的值

  1. >>>
小练习 5

将如下字典中的 Shawn 项的第二个成绩改为 98,然后将 Kate 项删除。

  1. >>> dic = { Edward’: [ 100, 97, 97 ],
  2. Shawn’: [ 100, 100, 98 ],
  3. Kate’: [ 97, 95, 92 ]}

4. 复合结构

4.1 复合结构的形式与创建

  1. >>> ls = [ { a’: 1 }, ( 2, 3 ) ] # 列表中包含字典和元组
  2. >>> seq = ( [ 1, 2, 3 ], { a’: 1 } ) # 元组中包含列表和字典
  3. >>> dic = { a’: [ 1, 2, 3 ], b’: ( 1, 2 ) }
  4. # 字典的值中包含列表和元组。
  5. # 注意,字典的键不允许有字典和列表出现。

4.2 值的操作

  1. >>> ls = [ { a’: 1 }, ( 2, 3 ) ]
  2. >>> ls[0][‘a’]
  3. 1
  4. >>> ls[1][5]
  5. 3
  6. >>> dic = { a’: [ 1, 2, 3 ], b’: ( 1, 2 ) }
  7. >>> dic[‘a’][0] = 2
  8. >>> dic
  9. { a’: [ 2, 2, 3 ], b’: ( 1, 2 ) }

4.3 数据结构的转换

示例:

  1. >>> ls = [ 1, 2, 3 ]
  2. >>> seq = ( 4, 5, 6 )
  3. >>> str = 789
  4. >>> str_ls = ”“.join(ls) # 将列表转换为字符串
  5. 123
  6. >>> ls_str = list(str) # 将字符串转换为列表
  7. [’7’, 8’, 9 ]
  8. >>> seq_ls = tuple(ls) # 将列表转换为元组
  9. ( 1, 2, 3 )
  10. >>> ls_seq = list(seq) # 将元组转换为列表

5. 课后作业

在数据库中,学生的名字与期末成绩以如下格式保存着:

  1. { ...,
  2. 学生 ID: [学生姓名, 语文成绩, 数学成绩, 英语成绩],
  3. 学生 ID: [学生姓名, 语文成绩, 数学成绩, 英语成绩],
  4. 学生 ID: [学生姓名, 语文成绩, 数学成绩, 英语成绩],
  5. ... }

例如:

  1. { ...
  2. 30: ['Shawn Pang', 78, 98, 94],
  3. 31: ['Edward Li', 100, 100, 100],
  4. 32: ['Imogene Liu', (80, 95, 92)],
  5. ...
  6. }

像这样的学生数据,在数据库中有 100 条。同时,学生的学生 ID 是从 0 开始到 99 结束,且一直保持连续。

请写出一个 Python 程序,将所有平均成绩高于 90 分的学生的名字以一个列表的形式打印出来。