除了简单数据类型,Python还允许将数据用不同方式组合起来创建结构体。
最简单的结构体是sequences(线性结构),它将信息一个接一个地存储起来,sequences分为两类:list(列表)和tuple(元组)。
list(列表)是一种有序的集合,可以随时添加和删除其中的元素。tuple(元组)与list非常类似,但是tuple一旦初始化就不能修改。
用“[]”将数字括起来可构成列表,用“()”将数字括起来可构成元组。在结构体名后面跟“[]”,并在其中填入下标就可以访问单个元素。
注意 :下标从0开始,因此list_1[0]和tuple_1[0]可以访问线性结构中的第一个元素。
图3.10 list与tuple的相似处
大多数情况下,list和tuple是相似的,如图3.10所示。
但是,在更新元素时就会发现列表和元组之间的差别:可以更新列表中的单个元素,但不能更新元组中的单个元素,如图3.11所示。
如果想更新元组中的单个元素,可以在一次性覆盖元组中的所有元素时,告诉Python将变量tuple_1赋一个新值以取代旧值,如图3.12所示。
字符串的操作符可以用于列表和元组,具体方法参考表3.3,部分操作如图3.13所示。
图3.11 用list与tuple更新单个元素时的差别
图3.12 用tuple更新元素
图3.13 用list与tuple进行字符串操作
列表的操作方法如表3.4所示。
表3.4 列表操作方法
注:在Python中,计数从0开始,所以对应人类语言多为 x +1。
前7个操作的结果如图3.14所示,它们中有些返回一个值,有些改变了list_1的值,有些改变了元素的顺序。
pop( x )比较特殊,首先,它返回列表中第 x +1个位置的元素值,随后从列表中删除该元素,如图3.15所示。
图3.14 列表操作结果
图3.15 pop( x )的操作结果
元组除了不能被修改外,其他与列表非常类似。所有对列表的操作方法,只要不改变元素的值,都可以用于元组;如果改变了元素的值,则出现错误信息,如图3.16所示。
列表和元组是元素的集合,每个元素都对应了其中的一个下标。在列表["a","b","c","d"]中,a的下标是0,b的下标是1,以此类推。
如果要创建一个数据结构,把学号与名字关联起来,就要用到字典(dictionary,简称dict)。Python内置的字典使用键-值(key-value)存储,具有极快的查找速度。
图3.16 对元组的操作
dict的实现原理和查字典是一样的。
假设字典包含了1万个汉字,要查某个字时,一种办法是把字典从第一页往后翻,直到找到想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。dict就是用第二种实现方式。
在Python中,可以使用通过“{}”来定义的字典,如图3.17所示。
图3.17 定义字典
字典中的元素称为键值对,其中第一部分是键(key),第二部分是值(value)。只需要给定一个新键及其对应的值,就可以在字典中添加新元素,如图3.18所示。
图3.18 添加新元素
dict的特点如下:
· 查找和插入的速度极快,不会随着key的增加而变慢。
· 需要占用大量的内存,内存浪费多。
list的特点如下:
· 查找和插入的时间随着元素的增加而增加。
· 占用空间小,浪费内存很少,所以dict是用空间来换取时间的一种方法。
与列表和元组使用下标、字典使用键不同,Python的集合(set)允许将一堆数据放在一起而不用指定下标或序号。
集合set和字典dict的唯一区别仅在于没有存储对应的value,Python用于集合的操作方法如表3.5所示。
表3.5 集合的操作方法
对两个集合herbs和spices的上述操作结果如图3.19所示。
图3.19 集合操作结果