请使用最新版本浏览器访问此演示文稿以获得更好体验。
Python 中具有一些内建的数据结构,这些数据结构能方便地存储数据,并具有特殊的方法来获取或操纵数据。
常用的内建数据结构包括:
这四种类型都相当于存储数据的容器,也可统称为容器(Container)类型或集合(Collection)类型。
在这些数据结构中,字符串、列表、元组以及 range、zip、map 和 enumerate 等这些有序类型又都属于序列类型。其中列表、元组、range 对象为三种基本的序列类型。
序列是一块用于存放多个值的连续内存空间,并且按一定顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置,通过该索引可以取出相应的值。
序列类型支持一些通用的操作,包括索引、切片、拼接(序列相加)、重复(序列与自身多次相加)、用 in 运算符检查某个元素是否是序列成员、通过内置函数计算序列的长度/最大值/最小值等。
集合和字典也支持一些序列操作,但严格来说,他们不属于序列类型,他们都不支持索引、切片、相加和相乘操作。
| 运算 | 结果 | 
|---|---|
x in s | 
                    如果 s 中的某项等于 x 则结果为 True,否则为 False | 
                
x not in s | 
                    如果 s 中的某项等于 x 则结果为 False,否则为 True | 
                
s + t | 
                    s 与 t 相拼接 | 
s * n 或 n * s | 
                    相当于 s 与自身进行 n 次拼接 | 
s[i] | 
                    s 的第 i 项,起始为 0 | 
s[i:j] | 
                    s 从 i 到 j 的切片 | 
s[i:j:k] | 
                    s 从 i 到 j 步长为 k 的切片 | 
len(s) | 
                    s 的长度 | 
min(s) | 
                    s 的最小项 | 
max(s) | 
                    s 的最大项 | 
s.index(x[, i[, j]]) | 
                    x 在 s 中首次出现项的索引号(索引号在 i 或其后且在 j 之前) | 
s.count(x) | 
                    x 在 s 中出现的总次数 | 
| 运算 | 结果 | 
|---|---|
s[i] = x | 
                    将 s 的第 i 项替换为 x | 
s[i:j] = t | 
                    将 s 从 i 到 j 的切片替换为可迭代对象 t 的内容 | 
del s[i:j] | 
                    等同于 s[i:j] = [] | 
                
s[i:j:k] = t | 
                    将  s[i:j:k] 的元素替换为 t 的元素 | 
                
del s[i:j:k] | 
                    从列表中移除 s[i:j:k] 的元素 | 
                
s.append(x) | 
                    将 x 添加到序列的末尾 (等同于 s[len(s):len(s)] = [x]) | 
                
s.clear() | 
                    从 s 中移除所有项 (等同于 del s[:]) | 
                
s.copy() | 
                    创建 s 的浅拷贝 (等同于  s[:]) | 
                
s.extend(t) 或 s += t | 
                    用 t 的内容扩展 s (基本上等同于 s[len(s):len(s)] = t) | 
                
s *= n | 
                    使用 s 的内容重复 n 次来对其进行更新 | 
s.insert(i, x) | 
                    在由 i 给出的索引位置将 x 插入 s (等同于 s[i:i] = [x]) | 
                
s.pop() 或 s.pop(i) | 
                    提取在 i 位置上的项,并将其从 s 中移除 | 
s.remove(x) | 
                    删除 s 中第一个 s[i] 等于 x 的项目。 | 
                
s.reverse() | 
                    就地将列表中的元素逆序。 | 
列表、元组、集合和字典都属于可迭代对象(即能通过 for 语句遍历的对象),Python 的标准库中内置了许多操作这些可迭代对象的函数,如下所示:
| 运算 | 结果 | 
|---|---|
all(iterable) | 
                    当 iterable 为空,或其中的所有元素都为真值返回 True | 
                
any(iterable) | 
                    当 iterable 中的任一元素为真值时返回 True | 
                
 sum(iterable, /, start=0) | 
                    从 start 开始自左向右对 iterable 的项求和并返回总计值。 iterable 的项通常为数字,而 start 值则不允许为字符串。 | 
                        str(object)
                     | 
                    返回 object 的字符串表示形式 | 
                        list(iterable)
                     | 
                    根据 iterable 创建一个新的列表 | 
                        tuple(iterable)
                     | 
                    根据 iterable 创建一个新的元组 | 
                        set(iterable)
                     | 
                    根据 iterable 创建一个新的集合 | 
                        dict(mapping)dict(iterable)
                     | 
                    根据 mapping 或 iterable 创建一个新的字典 | 
                        reversed(seq)
                     | 
                    根据序列 seq 生成一个反向的迭代器 | 
                        sorted(iterable)
                     | 
                    根据 iterable 中的项返回一个新的已排序列表 | 
                        enumerate(iterable, start=0)
                     | 
                    返回一个枚举对象(由索引和值构成的元组形成的序列),一般用在 for 循环中 | 
                
列表是任意对象的有序、可变序列,通常用于存放同类项目的集合。列表实现了前面给出的所有通用和可变序列的操作。
可通过方括号来构建列表,方括号内的各个对象使用逗号 , 分割。如下所示:
            pets = ['dog', 'cat', 'rabbit', 'fish']
            squares = [1, 4, 9, 16, 25]
            print(pets, type(pets))  # ['dog', 'cat', 'rabbit', 'fish'] <class 'list'>
            print(squares, type(squares))  # [1, 4, 9, 16, 25] <class 'list'>
        
        列表中也可以包含混合类型元素:
            mixed_list = ['dog', 4, False, ['a', 'c']]
        
    不包含任何元素的列表称为空列表,用 [] 表示。下面创建一个名称为 empty_list 的空列表:
            empty_list = []
        
        也可以使用内置的 list() 函数(这是列表类型的构造器)从一个可迭代对象创建列表:
            list1 = list( (1, 2, 3) )  # [1, 2, 3]
            list2 = list( [1, 2, 3] )  # [1, 2, 3]
            list3 = list('abcd')  # ['a', 'b', 'c', 'd']
            list4 = list(range(3, 13, 3))  # [3, 6, 9, 12]
            list5 = list( {'mammal', 'bird', 'reptile', 'fish'} )  # ['mammal', 'fish', 'bird', 'reptile']
            list6 = list()  # 空列表 []
        
    还可以使用形如 [x for x in iterable] 的列表推导式创建列表:
            list1 = [x for x in range(5)]  # [0, 1, 2, 3, 4]
            list2 = [x ** 2 for x in range(5)]  # [0, 1, 4, 9, 16]
            list3 = [x ** 2 for x in range(5) if x % 2 == 0]  # [0, 4, 16]
        
        上例中,list3 的创建相当于如下代码的简写形式:
            list3 = []
            for x in range(5):
                if x % 2 == 0:
                    list3.append(x ** 2)
        
    可以使用与前面所述序列的通用操作访问列表元素,或对列表进行切分。如下所示:
            pets = ['dog', 'cat', 'rabbit', 'fish']
            print(pets[0])  # dog
            print(pets[3])  # fish
            print(pets[-1])  # fish
            print(pets[-3])  # cat
            print(pets[1:3])  # ['cat', 'rabbit']
            print(pets[:3])  # ['dog', 'cat', 'rabbit']
            print(pets[3:1:-1])  # ['fish', 'rabbit']
            print(pets[:1:-1])  # ['fish', 'rabbit']
            print(pets[:-3:-1])  # ['fish', 'rabbit']
            print(pets[::-2])  # ['fish', 'cat']
        
    可以使用列表的 append() 方法将一个项目追加到列表的末尾,也可以使用 insert() 方法在特定的索引处插入项目,使用 pop() 方法移出(删除)列表中最后一个元素,使用 remove() 方法移除特定的元素值,使用 del 关键字删除特定索引对应的元素,甚至删除整个列表。
            pets = ['dog', 'cat', 'rabbit', 'fish']
            pets.append('chick')  # 向列表的最后追加元素
            print(pets)  # ['dog', 'cat', 'rabbit', 'fish', 'chick']
            pets.insert(0, 'snake')  # 在索引 0 位置处插入 'snake',其他元素后移
            print(pets)  # ['snake', 'dog', 'cat', 'rabbit', 'fish', 'chick']
            pets.pop()  # 移出列表末尾的元素
            print(pets)  # ['snake', 'dog', 'cat', 'rabbit', 'fish']
            pets.remove('rabbit')  # 移除值为 'rabbit' 的元素,所要移除的值必须在列表中
            print(pets)  # ['snake', 'dog', 'cat', 'fish']
            del pets[0]  # 删除列表中索引为 0 的元素
            print(pets)  # ['dog', 'cat', 'fish']
            del pets  # 删除整个列表,pets 变量将不复存在
        
    要更改某一元素值,需要通过索引访问列表中的元素,然后为其赋新值;也可以为列表的切片赋新值。如下所示:
            pets = ['dog', 'cat', 'rabbit', 'fish']
            pets[-1] = 'chick'
            print(pets)  # ['dog', 'cat', 'rabbit', 'chick']
            
            pets[2:] = ['tortoise', 'snake', 'spider']
            print(pets)  # ['dog', 'cat', 'tortoise', 'snake', 'spider']
        
    列表属于可遍历类型,可以使用 for 循环语句逐个访问列表元素:
            pets = ['dog', 'cat', 'rabbit', 'fish']
            for pet in pets:
                print(pet)
            # dog
            # cat
            # rabbit
            # fish
        
    在程序开发时,经常要对列表进行排序。Python 提供了两种常用的对列表进行排序的方法:使用列表的 sort() 方法,或使用内置的 sorted() 函数。
sort() 方法和 sorted() 函数的语法格式分别如下:
            list_object.sort(key=None, reverse=False)
            sorted(iterable, key=None, reverse=False)
        
        其中 list_object 和 iterable 是要进行排序的对象。key 形参用于指定排序规则,默认为 None,表示直接按元素值进行排序;该参数的值为一个函数,此函数接受一个参数并返回一个用于排序的键,如设置为 key=str.lower 表示在排序时不区分字母大小写。reverse 形参为可选参数,默认为 False,表示按升序排序;如果设为 True,表示按降序排序。
sort() 方法使用示例:
            pets = ['dog', 'cat', 'Rabbit', 'fish']
            pets.sort()
            print(pets)  # ['Rabbit', 'cat', 'dog', 'fish']
            
            pets = ['dog', 'cat', 'Rabbit', 'fish']
            pets.sort(key=str.lower)
            print(pets)  # ['cat', 'dog', 'fish', 'Rabbit']
            
            pets = ['dog', 'cat', 'Rabbit', 'fish']
            pets.sort(key=str.lower, reverse=True)
            print(pets)  # ['Rabbit', 'fish', 'dog', 'cat']
        
    sorted() 函数使用示例:
            pets = ['dog', 'cat', 'Rabbit', 'fish']
            pets_sorted = sorted(pets)
            print(pets)  # ['dog', 'cat', 'Rabbit', 'fish']
            print(pets_sorted)  # ['Rabbit', 'cat', 'dog', 'fish']
            
            pets = ['dog', 'cat', 'Rabbit', 'fish']
            pets_sorted = sorted(pets, key=str.lower, reverse=True)
            print(pets_sorted)  # ['Rabbit', 'fish', 'dog', 'cat']
        
        关于排序的详细操作,请参见排序指南。
可以使用 in 运算符检查某一元素是否存在:
            pets = ['dog', 'cat', 'rabbit', 'fish']
            print('cat' in pets)  # True
        
        count() 方法可获取指定元素出现的次数:
            pets = ['dog', 'cat', 'rabbit', 'fish', 'cat']
            print(pets.count('fish'))  # 1
            print(pets.count('cat'))  # 2
        
    可以使用 extend() 方法将一个列表的所有元素添加到另外一个列表末尾:
            nums1 = [1, 2, 3]
            nums2 = [4, 5, 6]
            nums1.extend(nums2)
            print(nums1)  # [1, 2, 3, 4, 5, 6]
        
        可以使用 reverse() 方法将一个列表中的元素逆序:
            nums1 = [1, 2, 3]
            nums1.reverse()
            print(nums1)  # [3, 2, 1]
        
    当列表的元素也是列表时,相当于一个二维列表。如下代码创建了一个表示力学中应力张量(三维实对称二阶张量)的变量,并通过嵌套的 for 循环语句逐次访问并打印该张量的元素,最后计算该张量的对角元素之和(张量的第一不变量):
            sigma = [[26.7, 25.6, 10.8],
                     [25.6, 30.1, 24.9],
                     [10.8, 24.9, 15.4]]
            for row in sigma:
                for element in row:
                    print(element, end='\t')
                print()
            i1 = sigma[0][0] + sigma[1][1] + sigma[2][2]
            print(i1)
        
    元组是任意对象的有序、不可变序列,通常用于储存异构数据的集合,或是同构数据的不可变序列。除了是不可变的,元组在其他方面和列表基本相同。元组实现了所有通用的序列操作。
可通过圆括号来构建列表,圆括号内的各个对象使用逗号 , 分割。如下所示:
            pets = ('dog', 'cat', 'rabbit', 'fish')
            coordinate = (23.4, 35.6, 67.8)
            mixed_tuple = ('dog', 4, False, ['a', 'c'])
            
            print(pets, type(pets))  # ('dog', 'cat', 'rabbit', 'fish') <class 'tuple'>
            print(coordinate, type(coordinate))  # (23.4, 35.6, 67.8) <class 'tuple'>
            print(mixed_tuple, type(mixed_tuple))  # ('dog', 4, False, ['a', 'c']) <class 'tuple'>
        
    尽管在打印输出时,元组总由圆括号标注,但在输入时,圆括号是可有可无的。如下所示:
            tuple1 = 1, 2, 3, 'c'
            print(tuple1, type(tuple1))  # (1, 2, 3, 'c') <class 'tuple'>
        
        请注意决定生成元组的其实是逗号而不是圆括号。圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。例如,f(a, b, c) 是在调用函数时传入三个参数,而 f((a, b, c)) 则是在调用函数时传输一个三元组参数。
不包含任何元素的元组称为空元组,用 () 表示。下面创建一个名称为 empty_tuple 的空元组:
            empty_tuple = ()
        
        只包含一个元素的元组是单元组,其表示形式为:
            singleton_tuple1 = 1,
            singleton_tuple2 = (1,)
            print(singleton_tuple1, type(singleton_tuple1))  # (1,) <class 'tuple'>
        
    也可以使用内置的 tuple() 函数(这是元组类型的构造器)从一个可迭代对象创建元组:
            tuple1 = tuple( [1, 2, 3] )  # (1, 2, 3)
            tuple2 = tuple( (1, 2, 3) )  # (1, 2, 3)
            tuple3 = tuple('abcd')  # ('a', 'b', 'c', 'd')
            tuple4 = tuple(range(3, 13, 3))  # (3, 6, 9, 12)
            tuple5 = tuple( {'mammal', 'bird', 'reptile', 'fish'} )  # ('reptile', 'bird', 'mammal', 'fish')
            tuple6 = tuple()  # 空元组 ()
        
    形如 t = 33, 'hello', True 的语句称为元组打包,这将值 33, 'hello' 和 True 一起打包进元组。元组打包的逆操作为:
            x, y, z = t
        
        该操作被称为序列解包,其右侧可以是元组、列表、集合或字典这些容器类型。如下所示:
            t = [33, 'hello', True]  # 对列表解包
            x, y, z = t
            print(x, y, z)  # 33 hello True
            t = {33, 'hello', True}  # 对集合解包
            x, y, z = t
            print(x, y, z)  # 33 hello True
            days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday'}  # 对字典解包
            x, y, z = days
            print(x, y, z)  # 1 2 3
        
    读取、遍历元组的各种操作与列表类似,不再赘述。
元组与列表很像,但两者使用场景不同,用途也不同。
元组是不可变的(immutable),一般可包含异质元素序列,常通过解包或索引访问。列表是可变的(mutable),列表元素一般为同质类型,常通过迭代访问。元组没有实现可变序列的操作,如添加或删除元素等。
元组比列表的访问和处理速度更快,所以当只是需要对其中的元素进行访问,而不进行任何修改时,建议使用元组。
列表不能作为字典的键,而元组可以。
集合是由不重复元素组成的无序容器。其基本用法包括成员检测、消除重复元素。集合对象支持并集、交集、差集、对称差集等数学运算。
创建集合用花括号或 set() 函数。如下为使用花括号创建集合:
            pets = {'dog', 'cat', 'rabbit', 'fish'}
            lucky_number = {6, 8, 9}
            mixed_set = {'dog', 4, False}
            
            print(pets, type(pets))  # {'rabbit', 'fish', 'dog', 'cat'} <class 'set'>
            print(lucky_number, type(lucky_number))  # {8, 9, 6} <class 'set'>
            print(mixed_set, type(mixed_set))  # {False, 4, 'dog'} <class 'set'>
        
    使用 set() 函数创建集合:
            set1 = set( [1, 2, 3] )  # {1, 2, 3}
            set2 = set( (1, 2, 3) )  # {1, 2, 3}
            set3 = set('abcd')  # {'a', 'b', 'c', 'd'}
            set4 = set(range(3, 13, 3))  # {9, 3, 12, 6}
            set5 = set( {'mammal', 'bird', 'reptile', 'fish'} )  # {'mammal', 'bird', 'fish', 'reptile'}
            set6 = set()  # 空集合 set()
        
        注意,空集合不能使用 {} 表示,而只能使用 set() 表示,前者表示一个空字典。
集合中的元素必须是可哈希的(hashable,要求其是不可变的),而列表是不可哈希的,因此 {'dog', 4, False, ['a', 'c']} 不是一个有效的集合字面量,但 {'dog', 4, False, ('a', 'c')} 是。
集合是可变的,可以通过如下方式添加或删除集合中的元素:
            pets = {'dog', 'cat', 'rabbit', 'fish'}
            pets.add('snake')  # add 方法用于向集合中添加元素
            print(pets)  # {'snake', 'rabbit', 'dog', 'cat', 'fish'}
            pets.remove('rabbit')  # remove 方法移除指定元素
            print(pets)  # {'fish', 'cat', 'dog', 'snake'}
            pets.pop()  # pop 方法随机从集合中删除一个元素
            print(pets)  # {'cat', 'fish', 'snake'}
            pets.clear()  # clear 方法删除集合中的所有元素
            print(pets)  # set()
            del pets  # del 删除集合
        
    对 Python 中集合的运算与数学上集合的运算相似,如下所示:
A | B,得到两个集合的所有元素放在一起组成的新集合。A & B,得到两个集合共有的元素放在一起组成的新集合。A - B,得到属于 A 的、但不属于 B 的元素组成的新集合。A ^ B,得到属于 A 或 B,但不同时属于 A 和 B 的元素组成的新集合。A | BA & BA - BA ^ BA | BA & BA - BA ^ B
            a = {1, 2, 3, 4}
            b = {3, 4, 5, 6}
            
            print(a | b)  # {1, 2, 3, 4, 5, 6}
            print(a & b)  # {3, 4}
            print(a - b)  # {1, 2}
            print(a ^ b)  # {1, 2, 5, 6}
        
    字典在其他语言中又常被称为关联数组、散列表或映射,它是一种无序的、可变的数据集合。字典中保存键: 值对(key:value pair)形式的数据。其中键必须是唯一的,且必须是可哈希(不可变)类型,通常为字符串或数字;而值可以为任意数据类型,且是可以重复的。字典的主要用途是通过键存储、提取值。
从 Python 3.7 开始,字典变为有序的,字典会保留插入时的顺序,对键的更新不会影响顺序,删除并再次添加的键将被插入到末尾。不过为了各个版本的兼容,目前尽量不要依赖字典中元素的排序来实现程序逻辑。
字典支持的常见操作见下页表。
| 运算 | 结果 | 
|---|---|
list(d) | 
                    返回字典 d 中使用的所有键的列表。 | 
                
len(d) | 
                    返回字典 d 中的项数。 | 
                
d[key] | 
                    返回字典 d 中以 key 为键的项,如果不存在此 key 则会引发 KeyError 错误。 | 
                
d[key] = value | 
                    将 d[key] 设为 value,如果存在 key,则修改其对应值,如果不存在,则添加项目。 | 
                
del d[key] | 
                    将 d[key] 从 d 中删除,如果不存在此 key 则会引发 KeyError 错误。 | 
                
key in d | 
                    如果在 d 中存在键 key 则返回 True,否则返回 False。 | 
                
iter(d) | 
                    返回以字典的键为元素的迭代器。这是 iter(d.keys()) 的快捷方式。 | 
                
key not in d | 
                    等价于 not key in d。 | 
                
d.clear() | 
                    移除字典中的所有元素。 | 
d.copy() | 
                    返回原字典的浅拷贝。 | 
dict.fromkeys(iterable[, value]) | 
                    使用来自 iterable 的键创建一个新字典,并将各个值设为 value。如果未提供 value,默认值为 None。 | 
                
d.get(key[, default]) | 
                    通过键获取值。如果 key 存在则返回对应值,否则返回 default,如果 default 未给出则默认为 None。相对于 d[key],该方法不会引发 KeyError 错误。 | 
                
| 运算 | 结果 | 
|---|---|
d.pop(key[, default]) | 
                    通过键删除项。如果 key 存在于字典中则将其移除并返回其值,否则返回 default。 如果 default 未给出且 key 不存在,则会引发 KeyError 错误。 | 
                
d.items() | 
                    返回由字典中的元素(键/值对)组成的一个新视图。 | 
d.keys() | 
                    返回由字典中的键组成的一个新视图。 | 
d.popitem() | 
                    从字典中移除并返回一个键/值对。键/值对会按后进先出(LIFO)的顺序被返回。该方法适合对字典进行消耗性迭代。 | 
reversed(d.keys()) | 
                    返回一个逆序获取字典键的迭代器。 | 
d.setdefault(key[, default]) | 
                    如果字典存在键 key,返回它的值。如果不存在,插入值为 default 的键 key,并返回 default。default 默认为 None。该方法可以安全地向字典中插入值而不会覆盖已有值。 | 
                
d.update([other]) | 
                    使用字典 other 的键/值对更新字典,覆盖原有的键。返回 None。 | 
                
d.values() | 
                    返回由字典中的值组成的一个新视图。 | 
d | other | 
                    合并字典对象 d 和 other 中的键和值来创建一个新的字典。当 d 和 other 有相同键时,other 的值优先。 | 
                
d |= other | 
                    用 other 的键和值更新字典 d,other 可以是 mapping 或 iterable 的键/值对。当 d 和 other 有相同键时,other 的值优先。 | 
                
可以在花括号内以逗号分隔的键: 值对表示字典:
            pet = {'name': '多多', 'species': 'Dog', 'breed': 'Husky',
                   'age': 4, 'weight': 14.1}
            days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday',
                    4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
            students = {'20804070201': {'name': '张三', 'gender': '男'},
                        '20804070202': {'name': '李四', 'gender': '男'},
                        '20804070203': {'name': '王老五', 'gender': '男'},
                        '20804070204': {'name': '白冰冰', 'gender': '女'},
                        '20804070205': {'name': '赵晓静', 'gender': '女'}}
            mixed_dict = {'name': '王老五', 34: 23.3, True: 'Something'}
            empty_dict = {}  # 空字典
        
    也可以使用 dict() 函数(这是一个类型构造器)创建字典,该函数有多种形式:
            a = {'one': 1, 'two': 2, 'three': 3}  # 直接给出字典字面量
            b = dict({'three': 3, 'one': 1, 'two': 2})  # 从字典创建字典
            c = dict(one=1, two=2, three=3)  # 通过给定关键字参数来创建字典
            # 从包含键/值对元组的列表或元组创建字典
            d = dict([('two', 2), ('one', 1), ('three', 3)])
            # zip 函数在多个迭代器上并行迭代,从每个迭代器返回一个数据项组成元组。
            # 该方法可以将多个列表或元组对应位置的元素组合为元组,进一步创建字典
            e = dict(zip(['one', 'two', 'three'], [1, 2, 3]))  # 拉链式键/值对
            f = dict({'one': 1, 'three': 3}, two=2)  # 混合使用各种方法
            # 以上通过不同形式创建的字典是相等的:
            print(a == b == c == d == e == f)  # True
            empty_dict = dict()  # 空字典
        
    还可以使用形如 {x: x for x in iterable} 的字典推导式创建字典:
            dict1 = {x: x for x in range(5)}  # {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
            dict2 = {x: x ** 2 for x in range(5)}  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
            dict3 = {x: x ** 2 for x in range(5) if x % 2 == 0}  # {0: 0, 2: 4, 4: 16}
        
        上例中,dict3 的创建相当于如下代码的简写形式:
            dict3 = {}
            for x in range(5):
                if x % 2 == 0:
                    dict3[x] = x ** 2
        
    不同于列表或元组,访问字典的元素不是通过偏移量,而是通过键来进行。
            days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
            print(days)  # {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
            print(type(days))  # <class 'dict'>
            print(len(days))  # 7
            print(list(days))  # [1, 2, 3, 4, 5, 6, 7]
            print(days.get(3))  # Wednesday
            print(days.get(8))  # None
            if 3 in days:
                print(days[3])  # Wednesday
        
    字典对象是可变的,可以随时修改其中的元素,或向其中添加新的键/值对,这些操作都可以通过 d[key] = value 的方式实现。另外,可以通过 del d[key] 删除字典中的某个元素。
            days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
            if 7 in days:
                del days[7]  # 删除元素
            
            days[0] = 'Sunday'  # 添加新元素
            print(days[0])  # Sunday
            
            print(days[1])  # Monday
            days[1] = '星期一'  # 修改元素值
            print(days[1])  # 星期一
        
    由 dict.keys(), dict.values() 和 dict.items() 所返回的对象是视图对象。该对象提供字典内项目的一个动态视图,这意味着当字典改变时,视图也会相应改变。字典视图可以被迭代以产生与其对应的数据,并支持使用 in 运算符进行成员检测。
            days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
            print(days.keys())  # dict_keys([1, 2, 3, 4, 5, 6, 7])
            print(days.values())  # dict_values(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'])
            print(days.items())  # dict_items([(1, 'Monday'), (2, 'Tuesday'), (3, 'Wednesday'), (4, 'Thursday'), (5, 'Friday'), (6, 'Saturday'), (7, 'Sunday')])
            
            # 可以通过 list(), tuple() 或 set() 函数将这些视图对象转换为列表、元组或集合
            print(list(days.keys()))  # [1, 2, 3, 4, 5, 6, 7]
            print('Wednesday' in days.values())  # True
        
    一般通过遍历某个字典视图对象来遍历字典。如下所示:
            days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
            for key, value in days.items():
                print(key, value)
            
            # 1 Monday
            # 2 Tuesday
            # 3 Wednesday
            # 4 Thursday
            # 5 Friday
            # 6 Saturday
            # 7 Sunday
        
    对于如下元组:
                    t = (3, 7, 8, 11)
                
                编写一个表达式,仅将其中的第一个元素 3 修改为 1,请给出两种方法。
自行从网络上搜索并学习冒泡排序法,实现在不使用 Python 中已有的用于排序的函数的前提下,对以下列表中的数字按照从小到大的顺序进行排序:
                    numbers = [43, 78, 31, 0, 63, 13, 23, 31, 20, 61]
                
                然后再自行学习二分查找法,不使用任何列表方法,也不使用 in 运算符,用二分查找法快速找出排序后的列表中值 43 所对应的索引位置。
某个班级期末考试的成绩单如下:
| 学号 | 姓名 | 数学 | 英语 | 物理 | 
|---|---|---|---|---|
| 2001 | 张三 | 88.5 | 64.0 | 75.0 | 
| 2002 | 李四 | 78.0 | 65.5 | 90.0 | 
| 2003 | 王老五 | 67.2 | 58.0 | 79.0 | 
| 2004 | 白冰冰 | 87.0 | 92.5 | 89.0 | 
| 2005 | 赵晓静 | 78.0 | 81.0 | 67.5 | 
请编写一个程序,选择适当的数据结构用一个变量存储上表中所有信息,计算并在该变量中存储所有学生的平均成绩,以类似表格的形式打印该班级的成绩单,要求表格比上表至少多一列和一行,即在最后一列打印各学生的平均成绩,同时在最后一行适当位置打印各科的平均成绩,以及总平均成绩。
选做:同时打印各人的班级排名,并按平均成绩从高到低的顺序排列各行。
提示:使用 f-string 或转义字符(如\t)以打印出样式美观的表格。
将上一题所编制的程序改造为一个查询程序,程序提示输入学号进行成绩查询。当输入的学号存在时,打印该学生的成绩信息;当输入的学号不存在时,提示输入信息有误。该程序能无限循环执行下去,直到输入 exit 时才退出。
提示:为了能快速查找,可以使用字典存储班级成绩表,字典的键设为学号。
要求:
安模作业02-04-学号-姓名.py 的源文件中,通过电子邮件以附件形式发给任课教师。安模作业02-04-学号-姓名 的形式。