第3 章 数据结构 第2章介绍的字符串是Python的一种序列类型。所谓序列,是指一块可存放多个值 的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置(称为索引)访问它们。 Python支持多种序列类型,除字符串外,还有列表、元组、集合和字典等。 3.1 列表 列表(list)是Python的一个内置对象类型,它具有强大的功能。Python程序员在处理 一组数据时,往往会首先考虑使用list。 本节首先介绍列表的索引、切片和修改等基本操作。在此基础上,读者可以参照2.3节 的方法,使用dir()和help()函数详细研究列表的使用方法。为了更有针对性,本节还会介 绍一些列表的特定功能,如排序、堆栈和队列等。 3.1.1 列表的索引和切片 在Python中,列表表现为用中括号(方括号)括起来,用逗号分隔的一系列值。例如, 值小于10的斐波那契子序列可用列表表示为 >>>fib=[1,1,2,3,5,8] >>>print(fib) [1, 1, 2, 3, 5, 8] 像字符串一样,列表以及其他大多数内建的序列类型,都可以被索引和切片。 >>>fib[0] 1> >>fib[2] 29 2> >>fib[-1] 8> >>fib[0:3] [1, 1, 2] >>>fib[-2:] [5, 8] 列表的切片操作返回一个新列表,而不是原列表的局部,如下的切片操作返回列表一 个新的副本。 >>>fib[:] [1, 1, 2, 3, 5, 8] in和notin操作符用于判断一个元素是否在列表中。 >>>fib=[1,1,2,3,5,8] >>>1 in fib True >>>3 in fib True >>>6 in fib False >>>6 not in fib True 需要说明的是,in和notin操作符适用于所有的Python序列类型,包括字符串、元组、 字典和集体等,在后续介绍相关内容时,对in和notin操作符不再赘述。 3.1.2 列表的修改 与字符串不同的是,列表是可变的,可以修改它的元素。 1.修改列表的元素和切片 既可以修改单个元素,也可以对切片进行修改。 >>>fib=[1,1,2,3,5,8] >>>fib[0]=0 #得到一个不正确的斐波那契数列 >>>fib [0, 1, 2, 3, 5, 8] >>>fib[0:2]=[1,1]#恢复正确 >>>fib [1, 1, 2, 3, 5, 8] 2.列表的连接与追加 列表也支持连接操作。 >>>fib=fib+[13,21,34] >>>fib 30 [1, 1, 2, 3, 5, 8, 13, 21, 34] 但只能是列表的连接,不能直接连接元素。 >>>fib=fib+55 Traceback(most recent call last): File "<pyshell#27>", line 1, in <module> fib=fib+55 TypeError: can only concatenate list (not "int") to list 可以使用append方法在列表的末尾添加新的元素。 >>>fib.append(55) >>>fib [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] append方法只能追加元素。 >>>fib.append([89,144]) >>>fib [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, [89, 144]] 上述示例说明两个问题。 (1)列表的元素可以是不同类型,例如: >>>languages=[1,'Python',2,'C#'] >>>languages [1, 'Python', 2, 'C#'] (2)列表可以嵌套,即允许一个列表中包含其他列表,列表可以是另一个列表的元素。 例如: >>>a=['a', 'b', 'c'] >>>n=[1, 2, 3] >>>x=[a, n]#x 中有两个元素,每个元素都是一个列表 >>>x [['a', 'b', 'c'], [1, 2, 3]] >>>x[0] ['a', 'b', 'c'] >>>x[0][1] 'b' 上述fib.append([89,144])其实是将一个列表作为新的元素追加到原列表的末尾处。 要想将一个列表的所有元素追加到另一个列表的末尾,除上述的连接操作外,还可以使用 extend方法。 >>>fib=[1,1,2,3,5,8] >>>fib.extend([13,21,34]) >>>fib [1, 1, 2, 3, 5, 8, 13, 21, 34] 31 3.列表的插入 除在末尾处追加外,还可以使用insert方法,向列表的任意位置插入新元素。插入时需 要指定新元素的索引和值。 >>>fib=[1,1,2,3,5,13,21] >>>fib.insert(5,8) >>>fib [1, 1, 2, 3, 5, 8, 13, 21] 4.列表的删除 从列表中删除元素有多种方法。如果知道要删除的元素在列表中的位置,可以使用 del语句。 >>>fib=[1,1,2,3,5,8,13,21] >>>del fib[5] >>>fib [1, 1, 2, 3, 5, 13, 21] del语句还可以从列表中删除切片或清空整个列表。 >>>fib=[1,1,2,3,5,8,13,21] >>>del fib[1:3] >>>fib [1, 3, 5, 8, 13, 21] >>>del fib[:] >>>fib [] del语句也可以删除整个变量。删除整个变量后,再试图引用该变量会引发错误,直到 另一个值赋给它为止。 >>>del fib >>>fib Traceback (most recent call last): File "<pyshell#43>", line 1, in <module> fib NameError: name 'fib' is not defined 注意:del不仅能删除列表,还能删除任何变量。 pop方法可删除列表末尾的元素,已删除的元素作为pop方法的返回值,可以继续 使用。 >>>fib=[1,1,2,3,5,8,13,21] >>>a=fib.pop() >>>a 21 >>>fib 32 [1, 1, 2, 3, 5, 8, 13] pop方法一般是在将列表作为堆栈时使用,此时插入和删除都在列表末尾处进行。一 般pop方法不带参数。实际上,可以使用pop方法来删除列表中任何位置的元素,只要在 pop方法中带上参数指明元素位置即可。 >>>fib=[1,1,2,3,5,8,13,21] >>>a=fib.pop(5) >>>a 8> >>fib [1, 1, 2, 3, 5, 13, 21] 如果不知道要删除元素的位置,只知道要删除元素的值,可以使用remove方法。 >>>fib=[1,1,2,3,5,8,13,21] >>>fib.remove(8) >>>fib [1, 1, 2, 3, 5, 13, 21] 如果列表中有多个等值的元素,remove方法一次只能删除一个。 >>>fib.remove(1) >>>fib [1, 2, 3, 5, 13, 21] 3.1.3 列表排序 有时需要将列表中无序的元素重新排列使其有序,Python提供多种方法对列表排序, 读者可根据需要选用。 1.使用sort方法对列表进行永久性排序 sort方法对列表中的元素进行原地排序。 >>>cars=['haval','byd','bmw','audi'] >>>cars.sort() >>>print(cars) ['audi', 'bmw', 'byd', 'haval'] 可以看出,经过sort()排序后,列表的元素次序已经永久性地改变。 在调用方法sort时如果加上参数reverse=True,可以按与字典排序相反的次序排序。 >>>cars.sort(reverse=True) >>>print(cars) ['haval', 'byd', 'bmw', 'audi'] 2.使用函数sorted()对列表进行临时排序 要保留列表元素原来的排列次序,同时用排序后的结果显示,可以使用函数sorted()。 33 >>>cars=['haval','byd','bmw','audi'] >>>#原始列表 >>>print(cars) ['haval', 'byd', 'bmw', 'audi'] >>>#排序后的结果 >>>print(sorted(cars)) ['audi', 'bmw', 'byd', 'haval'] >>>#原始列表并未改变 >>>print(cars) ['haval', 'byd', 'bmw', 'audi'] 可以看出,执行函数sorted()以后,原始列表并未改变。同样可以为函数sorted()加参 数reverse=True。 3.使列表逆序 要反转列表元素的排列次序,可以使用reverse方法。 >>>cars=['haval','byd','bmw','audi'] >>>cars.reverse() >>>print(cars) ['audi', 'bmw', 'byd', 'haval'] 可以看出,逆序是永久性的。 3.1.4 堆栈和队列 列表的append和pop方法,使得列表可以很方便地作为堆栈来使用。堆栈中最先进 入的元素最后被释放(后进先出),是非常常用的数据结构。用append方法可以把一个元 素添加到堆栈顶。用不指定索引的pop方法可以把一个元素从堆栈顶释放出来。 >>>stack=[3, 4, 5] >>>stack.append(6) >>>stack.append(7) >>>stack [3, 4, 5, 6, 7] >>>stack.pop() 7> >>stack [3, 4, 5, 6] >>>stack.pop() 6> >>stack.pop() 5> >>stack [3, 4] 还可以把列表当作队列使用。队列中最先进入的元素最先释放(先进先出),也是非常 34 常用的数据结构。不过,列表这样用效率不高。虽然向列表末尾添加元素很快,但在头部 弹出元素效率并不高,这是由列表的内部实现决定的(弹出头部元素,要移动整个列表中的 所有元素)。 如果要实现队列,可以使用collections.deque,它是为在首尾两端快速插入和删除而设 计的。 >>>from collections import deque >>>queue=deque(["Zhang", "Wang", "Li"]) >>>queue.append("Zhao") #Zhao 来了 >>>queue.append("Qian") #Qian 来了 >>>queue.popleft() #最先到达的人离开 'Zhang' >>>queue.popleft() #第二个到达的人离开 'Wang' >>>queue #仍然保持人员的到达次序 deque(['Li', 'Zhao', 'Qian']) collections是Python 的一个标准库,提供了许多有用的集合类。collections中的 deque类似于list,但在队列头部和尾部添加、删除元素的效率更高。除deque之外, collections还提供元组、字典和集合等序列的特色实现,与Python的原生数据结构相比,功 能往往更强大,针对性更强,有兴趣的读者可以自行了解。 3.2 元组 列表是可以修改的,非常适合存储在程序运行期间可能变化的数据集。如果需要创建 一系列不可修改的元素,如用于参数传递,再如取数据库中的一条记录,可以使用元组。与 列表相比,元组的数据结构更简单,处理速度更快。 1.元组的声明 元组看起来像列表,但使用圆括号而不是方括号来标识。元组的元素类型可以互不相 同,元素索引及切片的规定与列表相同。 >>>a=(123,321,'Python') >>>a (123, 321, 'Python') >>>a[0] 123 >>>a[2] 'Python' >>>a[1:] (321, 'Python') 元组在输出时总是有括号,以便正确表现元组的逻辑结构。在输入时可以不用圆 括号。 35 >>>b=1,'Zhang',28 >>>b (1, 'Zhang', 28) 但在编程过程中,使用圆括号往往是必需的,例如元组是一个更大的表达式的一部分, 不使用圆括号可能会产生混淆。所以,在任何情况下都使用圆括号是好习惯。 可以用len()函数查看元组的长度(元素数)。 >>>a=(123,321,'Python') >>>len(a) 3 同样可以用in和notin操作符判断一个元素是否在元组中。 >>>123 in a True >>>222 in a False 2.尝试修改 元组是不可修改的,不能给元组的一个独立的元素赋值。 >>>a=(123,321,'Python') >>>a[0]=111 Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> a[0]=111 TypeError: 'tuple' object does not support item assignment 但元组变量可以重新赋值。 >>>a=(123,321,'Python') >>>a=(123,321) >>>a (123, 321) 3.元组的封装和拆封 为了方便多值与序列的转换,Python支持元组的封装和拆封操作。前述示例 >>>b=1, 'Zhang', 28 其实就是元组的封装,3个值被自动封装进元组。封装的逆操作称为拆封。 >>>c, d, e=b >>>c 1> >>d 'Zhang' >>>e 28 36 在上述示例中,元组的3个元素被分别赋值给左侧的3个变量。 事实上,等号右边可以是任何线性序列,如列表。 >>>b=[1, 'Zhang', 28] >>>b [1, 'Zhang', 28] >>>c, d, e=b >>>c 1> >>d 'Zhang' >>>e 28 但实际编程中,元组的封装与拆封使用得最多,如可变参数和多返回值等,详见第5章。 需要注意的是,拆封要求左侧的变量数量与序列的元素个数严格相同。 >>>b=(1, 'Zhang', 28) >>>c, d=b Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> c, d=b ValueError: too many values to unpack (expected 2) 3.3 字典 另一个非常有用的Python序列是字典。字典和列表有相似之处,列表使用[]来定义, 而字典使用{},元素都是用逗号(,)分隔。不同的是,列表的索引是从0开始的有序整数,而 字典的索引是键(关键字)。字典的键可以是任意不可变类型,如数字、字符串和元组等,一 般用字符串,键与值之间用冒号(:)分隔。不能用列表做关键字,因为列表可以用索引、切 割或者append和extend等方法来改变。与前面介绍的序列类型不同,字典以及3.4节将 要介绍的集合,都不支持索引、切片和相加等操作。 >>>dict1={'姓名': '张三', '年龄': 19, '年级': '大二', '成绩': '及格'} >>>print(dict1) {'姓名': '张三', '年龄': 19, '年级': '大二', '成绩': '及格'} 字典中的键必须是唯一的,且不可变;字典中的值可以不唯一,且可变。字典的最常用 操作是依据键来存取值。 >>>dict1['姓名'] '张三' 可以使用values方法访问所有值。 >>>dict1.values() 37 dict_values(['张三', 19, '大二', '及格']) >>>type(dict1.values()) <class 'dict_values'> >>>list(dict1.values()) ['张三', 19, '大二', '及格'] 在Python的当前版本中,values方法返回的是一种称为dict_values的序列类型,它支 持成员测试以及迭代等操作。可以使用list()函数创建值的列表。 可以使用keys方法访问所有键。 >>>dict1.keys() dict_keys(['姓名', '年龄', '年级', '成绩']) >>>type(dict1.keys()) <class 'dict_keys'> >>>list(dict1.keys()) ['姓名', '年龄', '年级', '成绩'] keys方法返回的是一种称为dict_keys的类型,也可以使用list()函数创建键列表。 可以使用items方法来访问字典中的所有键和值。 >>>dict1.items() dict_items([('姓名', '张三'), ('年龄', 19), ('年级', '大二'), ('成绩', '及格')]) >>>type(dict1.items()) <class 'dict_items'> >>>list(dict1.items()) [('姓名', '张三'), ('年龄', 19), ('年级', '大二'), ('成绩', '及格')] items方法返回的是一种称为dict_items的类型。在dict_items中,每个元素是一个由 键和值组成的元组,同样可以使用list()函数创建字典元素列表。 字典是可修改的,可以向字典中添加新的元素,修改字典中原有元素的值,或者删除字 典中的某一个元素。 >>>dict1['性别']='男' #添加新元素 >>>print(dict1) {'姓名': '张三', '年龄': 19, '年级': '大二', '成绩': '及格', '性别': '男'} >>>dict1['成绩']='优秀' #修改原有元素的值 >>>print(dict1) {'姓名': '张三', '年龄': 19, '年级': '大二', '成绩': '优秀', '性别': '男'} >>>del dict1['成绩'] #删除一个元素 >>>print(dict1) {'姓名': '张三', '年龄': 19, '年级': '大二', '性别': '男'} 从上面的示例能够看出,可以用del删除字典项。但是,试图从一个不存在的键中取 值,或者删除一个不存在的字典项,都会导致错误。 >>>dict1['民族'] Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> 38 dict1['民族'] KeyError: '民族' 使用clear方法可以删除字典内所有元素。 >>>dict1.clear() >>>print(dict1) {} 一对大括号{}创建一个空的字典。 >>>dict2={} >>>print(dict2) {} >>>dict2['语言']='Python' >>>print(dict2) {'语言': 'Python'} dict()构造函数可以直接从键值对列表创建字典。 >>>dict3=dict([('语言','Python'), ('平台','Windows'), ('数据库','MySQL')]) >>>print(dict3) {'语言': 'Python', '平台': 'Windows', '数据库': 'MySQL'} 如果键是字符串,有时通过关键字参数指定键值对更方便。 >>>dict4=dict(语言='Python', 平台='Windows', 数据库='MySQL') >>>print(dict4) {'语言': 'Python', '平台': 'Windows', '数据库': 'MySQL'} 3.4 集合 集合是一个无序不重复元素的序列,分为以下两种。 (1)set:可变集合。集合中的元素可以动态地增加或删除。 (2)frozenset:不可变集合。集合中的元素不可改变。 可以说frozenset是set的不可变版本,本节介绍set。 集合可以用大括号{}或set()函数来创建。如果想要创建空集合,只能用set()函数,因 为{}用来创建空字典。 >>>set1={'Python','C++','Java'} >>>print(set1) {'Java', 'Python', 'C++'} >>>set2=set(['Python','C++','Java','Java']) >>>print(set2) {'Java', 'Python', 'C++'} >>>set3=set('abracadabra') 39 >>>print(set3) {'c', 'a', 'r', 'd', 'b'} >>>set4=set('alacazam') >>>print(set4) {'c', 'a', 'l', 'z', 'm'} >>>set5=set() >>>print(set5) set() 上面的示例演示了集合的创建方法,同时演示了集合的去重复特性。试图通过索引访 问集合元素会引发错误。 >>>set1={'Python','C++','Java'} >>>set1[0] Traceback (most recent call last): File "<pyshell#13>", line 1, in <module> set1[0] TypeError: 'set' object is not subscriptable 集合中的元素可以动态地增加或删除。 >>>set1={'Python','C++','Java'} >>>set1.add('C#') >>>set1 {'C#', 'Python', 'C++', 'Java'} >>>set1.remove('Java') >>>set1 {'C#', 'Python', 'C++'} 集合支持并(运算符|)、交(运算符&)、差(运算符-)和异或(运算符^)等数学运算。 >>>set3=set('abracadabra') >>>set3 {'c', 'a', 'r', 'd', 'b'} >>>set4=set('alacazam') >>>set4 {'c', 'a', 'l', 'z', 'm'} >>>set3 | set4 {'c', 'a', 'r', 'd', 'l', 'z', 'm', 'b'} >>>set3 & set4 {'c', 'a'} >>>set3-set4 {'d', 'b', 'r'} >>>set3 ^ set4 {'z', 'm', 'b', 'r', 'd', 'l'} 3.5Python集成开发环境 本书前面的示例,每个命令都只有一行,而真正的Python程序会大量使用多行命令。 在命令行状态下(无论是Pyhn解释器还是IDLE), 输入多行命令都需要一定技巧,见1. to3 节。在命令行状态下,输入多行命令比较麻烦,更不用说调试和纠错了。 使用IDLE 或者Python解释器非常适合简单程序,但对于大型的编程项目则力不从 心,这时就需要选择一个合适的集成开发环境。 集成开发环境(InertdDvlpmetEnionIDE) tgaeeeonvrnmet,是专用于软件开发的程序。 IDE 将支持软件开发的一系列工具集成到一起,这些工具至少包括一个专门处理代码的编辑 器(如提供语法高亮和自动补全等功能), 还应该包括构建、执行、调试和版本控制工具等。 3.1 集成开发环境介绍 5. 能够进行Python程序开发的集成开发环境很多,本节介绍几款Windows环境下常用 的Python语言集成开发环境。 1.VisualStudio 由Microsoft建立的VisualStudio是一款全功能集成开发平台。VisualStudio仅兼容 Windows和MacOS 操作系统,它既提供免费版(社区版)也提供付费版(专业版和企业 版)。随着VisualStudio版本的升级,对Python的支持度越来越高。 2.VisualStudioCode 与完全版的VisualStudio不同,VisualStudioCode(也称作VSCode)是一款兼容 Linux、MacOSX 和Windows平台的全功能代码编辑器。在Anaconda中,VSCode是选 装组件,使用非常方便,Anacond5节。 a的介绍见6. 3.PyChm PyCharm(a) 是(r) 专门面向Python的全功能集成开发环境。拥有付费版(专业版)和免费开 源版(社区版), 无论在Windows、MacOSX 还是Linux操作系统中都支持快速安装和使 用。在PyCharm 中可以直接运行和调试Python程序,并且支持源码管理和项目。 4.Spydr Spyder是(e) 一款为数据科学工作做了优化的开源Python集成开发环境。它附在 Anaconda发行版中,随Anaconda自动安装。Spyder的目标受众是使用Python的数据科 学家,它很好地集成了一些诸如SciPy、NumPy和matplotlib这样的公共Python数据科 学库。 5.Ei6 Eric6(r) 是(c) 一个用Python语言编写的PythonIDE 。Eric6是用PyQt 开发的,因此它的 运行重度依赖几个Python包,如PyQt 等,这意味着使用Eric6要先理解Python的包管理, 对初学者稍嫌麻烦。但Eric6本身是用PyQt 开发的,使用它特别适合开发PyQt 程序。 40 3.2 PyChrm 的安装与使用 5.a PyCharm是Python语言开发中一个很受欢迎的IDE,界面与主流大型IDE(如Visual Studio等)相类似,集成的功能也很多。无论是有经验的程序员还是初学者,将PyCharm作 为Python开发环境都是不错的选择。 1.下载安装 到JetBrains的官网hs://www.etbrainscom/下载PyCharm 。PyCharm分为专业 tpj 版(Profesional)和社区版(Community),下载免费(.) 的社区版即可。写作本书时的最新版本 是2020.2,下载得到可执行文件pyhrmcnt-1.ee。 1.ca-ommuiy2020.2.x 执行该文件进行安装。安装是向导式风格,本书未提示的界面,单击Next按钮即可。 在ChooseInstalLocation界面,可以改变安装路径,如图3-1所示。 图3- 1 PyCharm 安装界面(一) 在InstalationOptions界面,选中所有复选框,如图3-2所示。 图3- 2 PyCharm 安装界面(二) 41 安装完成后重启计算机。 2.首次运行配置 第一次启动PyCharm时需要进行一些配置,是分步骤进行的。 第一步:设置IDE的配置信息,如果以前没有保存,选择Donotimportsetings即可, 如图3-3所示。 图3- 3 PyCharm 首次运行 第二步:界面主题的选择,有Darcula和Light两个选择,可以看到效果图,请读者根据 自己的喜好选择。 第三步:CustomizePyCharm页,不需要做任何改变。 3.编程示例 启动PyCharm,首先进入欢迎界面,如图3-4所示。 图3- 4 PyCharm 欢迎界面 PyCharm以目录为项目进行管理。预先创建一个目录,如E:\PyCharmProjects,用于 保存所有的PyCharm项目。 在图3-4所示的界面中选择CreateNewProject创建一个新项目,弹出如图3-5所示的 界面。 42 43 图3-5 创建新项目 在Location处输入或选择想要保存项目的目录。该目录不一定要事先存在,PyCharm 会自动创建。为新项目选择一个解释程序(Interpreter)。 新项目创建成功后,自动进入PyCharm 主界面,如图3-6所示。 图3-6 PyCharm 主界面 在PyCharm 主界面上,右击项目名称,在弹出的菜单中选择New→PythonFile,创建 一个文件test_while.py。在主界面上可以看到,该文件增加到了项目下,并已在右侧的编辑 器中自动打开,如图3-7所示。在编辑器中输入代码: a, b=0, 1 44 while b<10: print(b) a, b=b, a+b 图3-7 用PyCharm 编程 注意:在代码结束处不需要有空行,编辑后的文件会自动保存。 在左侧该文件名称上右击,在弹出的菜单中选择“Runt'est_while'”执行程序,界面下部 会显示程序执行的结果。 上面讲解了Python项目的开发过程。在实际开发中: ● 再次启动PyCharm 时,自动打开上次的项目。想要切换或创建新的项目,请先在菜 单中选择File→CloseProject关闭当前项目,并自动进入欢迎界面。 ● 图形化的编辑界面,程序代码可以反复修改执行,比在命令行工具中方便。 ● 必要时可以使用调试(Debug)模式,跟踪程序的执行并检错纠错,这是使用IDE的最 大优势。 在本书的后续内容中,将根据需要使用IDLE或者PyCharm 来验证代码。两者各有利 弊,使用PyCharm 程序结构更清晰,使用IDLE 更容易理解程序的执行步骤。使用IDLE 时,代码中包含提示符;使用PyCharm 时,会指明项目和文件名称,所以不会混淆。 3.6 习题 1.使用dir()和help()函数详细研究列表的使用方法。 2.用一个列表表示平方序列 sq=[1,4,9,16,25] 要求完成以下功能: (1)取第1个元素值。 (2)取倒数第一个元素值。 45 (3)取包含前三个元素的子列表。 (4)检查数据6和9是否在列表中。 (5)在列表的末尾追加一个值38。 (6)将刚追加的值改为36。 (7)将列表[49,64,81]的元素追加到原列表的末尾。 (8)在列表的首部插入一个值0。 (9)删除列表中的第5个元素。 (10)删除列表中值为9的元素。 3.创建一个字符串列表,包含一周中每天的英文简称,如Mon、Tue等。要求: (1)输出该列表的逆序。 (2)对该列表进行永久性排序。 (3)用str()函数将列表转换为字符串,观察其结果。 4.实现字符串反转:输入str="string",输出'gnirts'。 5.有如下列表: li=['alex','eric','rain'] 要求完成以下功能: (1)计算列表长度并输出。 (2)列表中追加元素"seven",并输出添加后的列表。 (3)在列表的第1个位置插入元素"Tony",并输出添加后的列表。 (4)将列表第2个位置的元素修改为"Kelly",并输出修改后的列表。 (5)删除列表中的元素"rain",并输出修改后的列表。 (6)删除列表中的第2个元素,并输出删除的元素的值和删除元素后的列表。 (7)删除列表中的第0个元素,并输出删除元素后的列表。 (8)删除列表中的第2~4个元素,并输出删除元素后的列表。 (9)将列表所有的元素反转,并输出反转后的列表。 6.假设有两个列表,a=[1,2,3],b=[4,5,6],请将两个列表合并。 7.创建一个存储学生信息的元组,有4个字段,分别为:学号=101、姓名='xiaoming'、 年龄=19、成绩=59.5。显示该生的学号和姓名。将该元组拆封到a、b、c和d的4个变量 中,并显示。 8.创建一个存储学生信息的字典,有4个元素,分别为:学号=101、姓名='xiaoming'、 年龄=19、成绩=59.5。显示该生的学号和姓名;将该生的成绩改为60;显示该字典的键列 表;显示该字典的值列表;显示该字典的元素列表。 9.将字符串"k:1|k1:2|k2:3|k3:4",处理成Python字典{k' ':1' ',k' 1':2' ',k' 2':3' ',k' 3': 4' '}。提示:读者可自行学习Python内置函数eval()的用法。 10.定义一个篮子集合 basket={'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} 要求完成以下功能: 46 (1)显示basket。 (2)检查c' rabgrass'是否在basket中。 (3)将c' rabgrass'添加到basket,显示basket。 (4)向basket中再添加一个a' pple',显示basket。 (5)删除basket中的'orange'。 11.有列表li=[1,1,6,3,1,5,2],删除其中的重复元素。 提示:可以预习第4章内容,并使用循环语句完成;也可以使用集合作为转换的中间 结果。 12.比较列表、元组、字典和集合的特点及用法。 13.有如下字典: dic={'k1':"v1","k2":"v2","k3":[11,22,33]} 要求完成以下功能: (1)输出所有的key。 (2)输出所有的value。 (3)输出所有的key和value。 (4)在字典中添加一个键值对"k4":"v4",输出添加后的字典。 (5)修改字典中"k1"对应的值为"alex",输出修改后的字典。 (6)在k3对应的值中追加一个元素44,输出修改后的字典。 (7)在k3对应的值的第1个位置插入一个元素18,输出修改后的字典。 14.完成以下转换: (1)将字符串s="alex"转换成列表。 (2)将字符串s="alex"转换成元组。 (3)将列表li=["alex","seven"]转换成元组。 (4)将元组tu=(a'lex',"seven")转换成列表。