1.按有序无序划分:
有序:列表 元组 字符串
无序:字典 集合
2.按可变不可变划分:
可变:列表 字典 集合
不可变:元组 字符串
1.列表
- 形如[1,2,3,‘aaa’] 所有元素放在一对方括号[]中,相邻元素之间使用逗号分隔。在Python中,同一个列表中元素的数据类型可以各不相同,可以同时包含整数、实数、字符串等基本元素类型,也可以包含列表、元组、字典、集合、函数以及其他任意对象。
- 列表(list)是包含若干元素的有序连续的内存空间。当列表增加或删除元素时,列表对象自动进行内存的扩展或收缩,从而保证相邻元素之间没有缝隙。
- 在非尾部位置插入或删除元素时会改变该位置后面的元素在列表中的索引,这对于某些操作可能会导致意外的错误结果。
除非确实有必要,否则应尽量从列表尾部进行元素的追加和删除操作。
1.1列表创建和删除
- 使用“=”直接将一个列表赋值给变量即可创建列表对象。
>>>list = ['a' , 'b' , 'c']
>>>list = [] #创建空列表
- 也可以使用list()函数把元组、range对象、字符串、字典、集合或其他可迭代对象转化为列表。
>>>list((1,2,3)) #将元组转换为列表
[1,2,3]
>>>list(range(1,2,3)) #将range对象转换为列表
[1,2,3]
>>>list('hello world') #将字符串转换为列表
['h','e','l','l','o','w','o','r','l','d']
>>>list({3,4,5}) #将集合转换为列表
[3,4,5]
>>>x = list() #创建空列表
- 当一个列表不再使用时,可以使用del命令将其删除。
>>>x=[1,2,3]
>>>del x #删除列表对象
>x #对象删除后无法再访问,抛出异常
NameError : name 'x' is not defined
1.2列表元素访问
- 创建列表之后,可以使用整数作为下标来访问其中的元素,其中0表示第1个元素,1表示第2个元素,2表示第3个元素,以此类推;列表还支持使用负整数作为下标,其中-1表示最后1个元素,-2表示倒数第2个元素,-3表示倒数第3个元素,以此类推。
>>>x = [ 'p', 'y' , 't' , 'h' , 'o' , 'n' ]
>>>x[0] #下标为0的元素 第一个元素
'p'
>>>x[-1] #下标为-1的元素 最后一个元素
'n'
1.3列表常用方法
-
append(x)
将x追加到列表尾部。 -
insert(index,x)
在列表index位置插入x,该位置后面所有元素后移,索引加1。若index为正数且大于列表长度则在列表尾部追加x,若index为负数且小于列表长度的相反数则在列表头部插入元素x。 -
remove(x)
在列表中删除第一个值为x的元素,该位置后面所有元素前移,索引减1。若列表中不存在x则抛出异常。 -
pop([index])
删除并返回列表中下标为index的元素。若不指定index默认值为-1,弹出最后一个元素;若弹出中间位置的元素则该位置后面所有元素前移,索引减1;若index不是[-L,L]区间上的整数则抛出异常。 -
index(x)
返回列表中第一个值为x的元素的索引,若不存在值为x的元素则抛出异常。 -
count(x)
返回x在列表中出现的次数。 -
reverse()
对列表所有元素进行原地逆序,首位交换。 -
sort(key=None,reverse=False)
对列表中的元素进行原地排序,key用来指定排序规则,reverse为False表示升序,True表示降序。
>>> x = list(range(11)) #包含11个整数的列表
>>> import random
>>> random.shuffle(x) #把列表x中的元素随机乱序
>>> x
[6,0,1,7,4,3,2,8,5,10,9]
>>> x.sort(key=str) #按转换为字符串后的大小,升序排序
>>> x
[0,1,10,2,3,4,5,6,7,8,9]
- extend(list)
将另一个列表的所有元素追加至当前列表的尾部。
1.4列表对象支持的运算符
- 加法运算符+也可以实现列表增加元素的目的,但返回新列表,涉及大量元素的复制,效率非常低。
>>> x = [1, 2, 3]
>>> x = x + [4] #连接两个列表
>>>x
[1,2,3,4]
- 乘法运算符*可以用于列表和整数相乘,表示序列重复,返回新列表。
>>> x = [1,2,3,4]
>>> x = x*2 #元素重复,返回新列表
>>> x
[1,2,3,4,1,2,3,4]
- 成员测试运算符in可以用于测试列表中是否包含某个元素,查询时间随着列表长度的增加而线性增加。
>>> 3 in [1,2,3]
True
>>> 3 in [1,2,'3']
False
1.5内置函数对列表的操作
max() 、min()函数用于返回列表中所有元素的最大值和最小值
sum()函数用于返回列表所有元素之和
len()函数用于返回列表中元素个数
zip()函数用于将多个列表中元素重新组合为元组并返回这些元组的zip对象
enumerate()函数返回包含若干下标和值的迭代对象
map()函数把函数映射到列表上的每一个元素
filter()函数根据指定函数的返回值对列表元素进行过滤
all()函数用来测试列表中是否所有元素都等价于True
any()函数用来测试列表中是否有元素都等价于True
2.元组(轻量级列表)
从形式上,元组的所有元素放在一对圆括号中,元素之间使用逗号分隔,如果元组中只有一个元素则必须在最后加一个逗号。
2.1元组创建和元素访问
>>>x=(1,2,3) #直接把元组赋值给一个变量
>>>x[0] #元组支持下标访问特定位置元素
1
>>>x[-1] #最后一个元素 元组也支持双向索引
3
>>>x[1]=4 #元组不可改变
TypeError:'tuple' object does not support item assignment
>>>x=(3,) #如果元组中只有一个元素则必须在最后加一个逗号
>>>x
(3,)
>>>tuple(range(5)) #用内置函数将其他迭代对象转换为元组
(0,1,2,3,4)
2.2元组与列表的异同点
- 列表和元组都属有序序列,都支持双向索引访问其中元素,以及使用count()方法统计指定元素的出现次数和index()方法获取指定元素的索引,len()、map()、filter()等大量内置函数和+、in等运算符也都可以作用于列表和元组。
- 元组书不可变序列,不可以直接修改元组中元素的值,也无法为元组增加或删除元素。
- 元组没有提供append()、extend()和insert()等方法,无法向元组中添加元素;同样,元组也没有remove()和pop()方法,也不支持对元组元素进行del操作,不能从元组中删除元素。
- 元组也支持切片操作,但是只能通过切片来访问元组中的元素,而不允许是用切片来修改元组中元素的值,也不支持使用切片操作来为元组增加或删除元素。
- Python的内部对实现元组做了大量的优化,访问速度比列表更快。
- 元组在内部实现上不允许修改其元素值,从而使得代码更加安全。
2.3生成器推导式
-
生成器推导式的用法与列表推导式非常相似,在形式上生成器推导式使用圆括号作为定界符。
-
生成器推导式的结果是一个生成器对象。生成器对象类似于迭代器对象,具有惰性求值的特点,只在需要时生成新元素,比列表推导式具有更高的效率,空间占用非常少,尤其适合大数据处理的场合。
-
使用生成器对象的元素时,可以根据需要将其转化为列表或元组,也可以使用生成器对象的_next_()方法或内置函数next()进行遍历,或直接使用for循环来遍历其中的元素。
-
但不管用哪种方法访问元素,只能从前往后访问,没有任何方法可以再次访问已经访问过的元素,也不支持使用下标访问其中的元素。
-
使用生成器对象的_next_()方法或内置函数next()进行遍历
>>>g=((i+2)**2 for i in range(10)) #创建生成器对象
>>>g
<generator object <genexpr> at 0x0000000003095200>
>>>tuple(g) #将生成器对象转换为元组
(4,9,16,25,36,49,64,81,100,121)
>list(g) #生成器对象已经遍历结束,没有元素了
[]
>>>g=((i+2)**2 for i in range(10)) #重新创建生成器对象
>>>g._next_() #使用生成器对象的_next_()方法获取元素
4
>>>g._next_() #获取下一个元素
9
>>>next(g) #使用函数next()获取生成器对象中的元素
16
- 使用for循环直接迭代生成器对象中的元素、
>>>g=((i+2)**2 for i in range(10))
>>>for item in g: #使用循环直接遍历生成器对象中的元素
print(item,end='') #end元素之间的分隔符
4 9 16 25 36 49 64 81 100 121
3.字典:反映对应关系的映射类型
- 字典是包含若干“键:值”元素的无序可变序列,字典中的每个元素包含用冒号分隔开的“键”和“值”两部分,表示一种映射或对应关系,也称关联数组。定义字典时,每个元素的“键”和“值”之间用冒号分隔,不同元素之间用逗号分隔,所有的元素放在一对大括号“{}”中。
- 字典中元素的“键”可以是Python中任意不可变数据,例如整数、实数、复数、字符串、元组等类型等可哈希数据。另外,字典中的“键”不允许重复,而“值”可重复。
3.1字典创建和删除
- 使用赋值运算符“=”将一个字典赋值给一个变量即可创建一个字典变量。
>>>aDict={'server':'db.diveintopython3.org','database':'mysql'}
- 也可以使用内置类dict以不同形式创建字典
>>>x = dict() #空字典
>>>x={} #空字典
>>>keys = ['a','b','c']
>>>values = [1,2,3,4]
>>>dictionary = dict(zip(keys,values)) #根据已有数据创建字典
>>>d=dict(name='Dong',age=39) #以关键参数的形式创建字典
- 字典中的每个元素表示一种映射关系或对应关系,根据提供的“键”作为下标就可以访问对应的”值“,如果字典中不存在这个”键“会抛出异常。
3.2字典元素的访问
- 字典对象提供了一个get()方法用来返回指定“键”对应的“值”,并且允许指定该键不存在时返回特定的“值”。例如:
>>>aDict.get('age') #若存在key=‘age’则返回对应的值
39
>>>aDict.get('address','Not Exists.') #若不存在key=‘age’则返回指定的默认值'Not Exists.'
- 使用字典对象的item()方法可以返回字典的键值对
- 使用字典对象的keys()方法可以返回字典的键
- 使用字典对象的values()方法可以返回字典的值
3.3元素的添加、修改与删除
- 当以指定“键”为下标为字典元素赋值时,有两种含义:
1.若该键存在,则表示修改该键对应的值
2.若该键不存在,则表示添加一个新的键值对,也就时添加一个新元素
>>>aDict={'1':'a','2':'b'}
>>>aDict['1']=22 #修改
>>>aDict
{'1':22,'2':'b'}
>>>aDict['3']='c' #添加
>>>aDict
{'1':22,'2':'b','3':'c'}
- 如果需要删除字典中指定的元素,可以使用del命令
>>>del aDict['age'] #删除字典元素
>>>aDict
{'score':[98,97],'sex':'male','a':97,'name':'Dong'}
4.集合
- 集合(set)属于Python无序可变序列,使用一对大括号作为定界符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复,不支持双向索引
- 集合中只能包含数字、字符串、元组等不可变类型(或者说可哈希)的数据,而不能包含列表、字典、集合等可变类型的数据
4.1集合对象的创建与删除
- 直接将集合赋值给变量即可创建一个集合对象
>>>a={3,5}
- 也可以使用函数set()将列表、元组、range对象等其他可迭代对象转换为集合。如果原来的数据中有重复元素,则在转换为集合时只保留一个
>>>b_set =set{[0,1,2,3,0,1,2,3,7,8]} #转换时自动去掉重复元素
>>>b_set
{0,1,2,3,7,8}
>>>x=set() #创建空集合
4.2集合操作与运算
1.集合元素增加和删除
- 使用集合对象的add()方法可以增加新元素,如果该元素已存在则忽略该操作
>>>s={1,2,3}
>>>s.add(3) #添加元素 重复元素自动忽略
>>>s
{1,2,3}
- pop()方法用于随机删除并返回集合中的一个元素,如果集合为空则抛出异常
- remove()方法用于删除集合中的元素,如果指定元素不存在则抛出异常
- discard()方法用于从集合中删除一个特定元素,如果元素不在集合中则忽略该操作
>>>s.discard(5) #删除元素,元素不在集合中则忽略该操作
>>>s
{1,2,3,4}
>>>s.remove(5) #删除元素,如果指定元素不存在则抛出异常
KeyError:5
>>>s.pop() #删除并返回一个元素
1
2.集合运算
>>>a_set=set([8,9,10,11,12,13])
>>>b_set={0,1,2,3,7,8}
>>>a_set|b_set #并集
{0,1,2,3,7,8,9,10,11,12,13}
>>>a_set&b_set #交集
{8}
>>>a_set-b_set #差集
{9,10,11,12,13}
5.序列解包
- 可以使用序列解包对多个变量同时进行赋值
>>>x,y,z=1,2,3 #多个变量同时赋值
>>>x,y=y,x #交换两个变量的值
>>>x,y,z=range(3) #可以对range对象进行序列解包
>>>>x,y,z=map(str,range(3)) #使用可迭代的map对象进行序列解包