Python中常用的序列结构有:列表、元组、字典、字符串、集合等。
从是否有序角度,序列分为有序序列和无序序列;
有序序列:列表、元组、字符串
无需序列:字典、集合
从是否可变角度,序列分为可变序列和不可变序列两大类;
生成器对象和range、map、enumerate、filter、zip等对象的某些用法也类似于序列,尽管这些对象更大的特点是惰性求值。列表、元组、字符串等有序序列以及range对象均支持双向索引,第一个元素下标为0,第二个元素下标为1,以此类推;若以负数作为索引,则最后一个下标为-1,倒数第二个下标为-2,以此类推。可以使用负整数作为索引Python有序序列的一大特色。
列表:
列表是包含若干元素的有序连续内存空间。当列表增加或删除元素时,列表对象自动进行内存的扩展与收缩,从而保证相邻两个元素之间没有缝隙。python列表的这个内存自动管理功能可以大幅度减少程序员的负担,但在插入和删除非尾部元素时会改变该位置后面的元素在列表中的索引,,这对于某些操作可能会导致意外的错误结果。所以除非确实必要,应尽量在列表的尾部进行元素的插入或删除。
在形式上,列表的所有元素放在一对方括号中,相邻元素之间使用逗号分隔。在python中,同一个列表中元素的数据类型可以相同,可以不同,可以包含整数、实数、字符串等基本类型的元素,也可以包含列表、元组、字典、集合、函数以及其他任意的对象,如果只有一对方括号而没有任何元素,则表示空列表。
python采用基于值的自动内存管理模式,变量并不是直接存储值,而是存储值的引用或者内存地址,这也是python中变量可以随时改变类型的重要原因。python列表中的元素也是值的引用,所以列表中各元素也可以是不同类型的数据。
字典转化为列表时,默认将字典的键转化为列表。如果想把字典的值转化为列表,需要使用字典对象的items()方法明确说明,当然也可以使用values()来明确说明要把字典的值转换为列表。
当列表不再使用时,可以使用del命令将其删除。
创建列表后,可以使用整数作为下标来访问其中的元素,下标0代表第1个元素。列表支持负数作为其下标,下标-1表示列表的最后一个元素。
列表的常用方法:
append(x):将x追加到列表的尾部
extend(L):将列表L中所有元素追加到列表尾部
inset(index,
x):在列表index处插入x,该位置后面的所有元素n后移并且在列表中的索引加1,如果index为正数且大于列表长度则在列表尾部追加x,如果index为负数且小于列表长度的相反数则在列表头部插入元素x。
remove(x):在列表中删除第x个元素,该元素之后所有元素迁移并且索引减1,如果列表中不存在x则抛出异常。
pop([index]):删除并返回列表中下标为index的元素,如果不指定index则默认为-1,弹出最后一个元素;如果弹出中间位置的元素则后面的元素索引减1,如果列表中不存在x则抛出异常。
clear():清空列表,删除列表中所有元素,保留列表对象。
index(x):返回列表中第一个值为x的索引,若不存在值为x的元素则抛出异常。
count(x):返回x在列表中出现的次数。
reverse():对列表中所有元素进行原地逆序,首尾交换。
sort(key = None, reverse =
False):对列表中的元素进行原地排序,key用来指定排序规则,reserve为False表示升序,True表示降序。
列表对象支持的运算符:
+:表示连接两个列表,x = [1, 2, 3] x = x + [4],x = [1, 2, 3,
4],此时id(x)发生改变;
+=:表示追加元素,x = [1, 2, 3], x += [4] ,此时x == [1, 2, 3,
4],此时id(x)不改变;
*:用于列表和整数相乘,表示序列重复,返回一个新的列表,从一定程度来说也可以实现为列表增加元素的功能。*=和*对列表id的改变与=和+=一致。
切片操作:
切片是python序列的重要操作之一,除了适用于列表之外,还适用于元组、字符串、range对象,但列表的切片操作具有强大的功能。不仅可以使用切片来截取列表中的任何部分返回的到一个新列表,也可以通过切片来修改和删除列表中的部分元素,甚至可以通过切片操作作为列表对象增加元素。
元组:
列表在很大程度上会影响运行效率,元组可以看成轻量级的列表。形式上,元组的所有元素放在一对圆括号中,元素之间是用逗号分隔,如果元素之间只有一个元素则必须在最后增加一个逗号。
元组属于不可变immutable序列,不可以直接修改元组中的值,也无法为元组增加或删除元素,只能用del删除整个元组。元组支持切片操作,但只能用切片来访问元组中元素的值,不支持切片来修改元组中的值,也不支持切片操作来为元组增加或删除元素。从一定程度上可以认为元组是轻量级的列表,或者“常量列表”。
python内部对元组做了最大优化,访问速度比列表更快。
作为不可变序列,元组与整数、字符串一样,都可以作为字典的键,也可以作为集合的元素。列表永远不能作为字典的键,也不能作为集合的元素。
内置函数hash()可以检测对象是否可以哈希,如果不可哈希,该函数抛出异常。
字典:
字典dict是包含若干个“键:值”元素的无需可变序列,字典中的每个元素包含用冒号分开的“键”和“值”两部分,表示一种映射或者对应关系,也称为关联数组。定义字典时,每个元素的“键”和“值”之间用冒号分隔,不同元素之间用逗号分隔,所有元素放在大括号中“{}”。
字典中元素的“键”可以是Python中任意不可变数据,如:实数、整数、复数、字符串、元组等类型的可哈希数据,但不能使用列表、集合字典或其他可变类型作为字典的键。字典中的键不允许重复,值可以任意重复,字典内部维护的哈希表使得检索操作非常快。使用内部字典类型时不太在乎元素的先后顺序,如果确实在乎元素顺序可以使用collections的OrderedDict类。
字典的创建与删除:
使用赋值运算符将一个字典赋值给一个变量即可创建一个字典变量,与其他类型一样,在不用时可以删除该字典。这里字典的创建是一个难点。
字典元素的访问:
字典中每个元素表示一种映射关系或者对应关系,根据提供的“键”作为下标可以访问对应的“值”,如果字典中不存在“键”会抛出异常。因此需要使用条件判断以避免异常。字典对象提供一个get()方法来返回制指定“键”的值,并且允许改指定键不存在时返回特定的值。
对字典对象直接进行迭代或者遍历时默认时遍历字典的“键”,如果需要遍历字典的元素必须使用字典对象的items()方法确定说明,如果遍历的是字典的值则必须使用字典对象的values()方法进行明确说明。当使用len()、max()、min()、sum()、sorted()、enumerate()、map()、filter()等内置函数以及成员测试运算符in对字典对象进行操作时,也遵循同样的约定。
元素的添加、修改与删除:
使用字典对象的update方法可以将另一个字典的“键:值”对一次性地全部添加到当前字典对象,如果两个字典中存在相同的“键”,则以另一个字典中的值为准对当前字典进行更新。
字典对象的setdefault()方法可以用来为字典添加新元素。如果需要删除字典中的元素可以使用del命令。字典对象的pop()和popitem()方法可以弹出并删除指定的元素。字典clear()方法可以用来清空字典对象中所有元素;copy()方法返回字典对象的浅拷贝。