1. list (列表)
python中列表表示可变的有序的集合,集合元素本身没有限制,可以为不同的数据类型。
定义列表的几种方式:
L = [1, -10.5, True, None]
L = [x for x in range(1, 10)] # 列表生成式,生成[1,2, ..., 9] 的列表
构建空的list:
L = []
L = list()
常用方法:
# 追加元素到末尾
L.append(12)
# 删除末尾元素
L.pop() # L.pop(-1)等价
# 将元素插入到指定位置
# 在第0个位置插入值-1,注意不能越界
L.insert(0, -1)
# 获取列表元素的值: L[i]
# 0 <= i < len(L)
# -i 表示倒数第i个元素索引
# 改变某个值
L[0] = 2
# 内置函数获取列表的长度
len(L)
2. tuple (元组)
它也是一种有序的序列,但是和列表的区别是:一旦初始化值之后,值不能再修改(对值的指向不能再改变)。
t = (1, -10.5, True, None)
# 定义空的元组
t = ()
t = tuple()
# 定义只含有一个元素的元组
t = (1,) # 不能写成t = (1), 因为t = (1) 等价于 t = 1, t就不是tuple了
t = (1, 2, 3, [1, 2, 3])
# 改变第0个元素的值
t[0] = -1 # Error
# 改变第3个元素的值
t[3] = [] # Error,因为改变了指向
t[3].insert(4) # OK,没有改变指向,列表本身是可变的
由于tuple本身不可变,因此没有类似list那样的insert,pop等方法。
3. 切片操作 (slice)
利用切片可以很简单的对list,tuple进行截取,甚至复制等。
# 可以对list或tuple进行切片(slice)操作
L = [x for x in range(1, 10)]
t = tuple(x for x in range(1, 10))
# 语法:L[x:y:z], x,y,z为整数,x表示切片起始位置(包括),y表示结束位置(不包括),z表示步进(step)
# 获取前4个值:
L[0:4]
L[:4]
# 获取后4个值
L[-4:]
# 获取第1到第5个值,每隔两个取一个
L[0:4:2]
# 复制一份list
L[:]
注意,切片返回的是新的list 或tuple,并未改变原来的值。
另,字符串本身也可以切片操作,以达到截取字符串的目的。
4. 字典(dict)
字典类似于java中的Map结构, 存储的是key-value键值对。
创建dict:
d = {'name': 'zhangsan', 'age':20, 'address': ['gz', 'sz']}
#支持关键字参数**kwargs
d = dict(name = 'zhangsan', age = 20)
#empty dict
d = dict()
常用方法:
#动态添加
d['score'] = 100
#覆盖旧值
d['score'] = 99
#取值
#key不存在报错
d['score']
#key不存在返回None
d.get('score')
d.pop('score')
#删除所有
d.clear()
字典支持str, int, 甚至tuple作为key(前提是tuple没有可变元素), 但是list是可变的,不能作为key。
5. set
set可以看成字典key的无序集合,自带去重效果。
创建set:
s = {1,2,3}
#也可以传入可迭代对象,如list, str
s = set([1,2,3]) #==> {1,2,3}
s = set('123') #==> {'1', '2', '3'}
#empty set
s = set()
s = {} #Error,这不是一个set
常用方法:
#添加元素
s.add(5)
s.add((1,))
s.add((1,2,[1,2])) # Error,虽然是元组作为key,但元组又包含了可变的list
s.add([1,2, 3]) #Error , set要求值是不可变的, 因为需要计算hash值
#删除元素, key不存在会报错
s.remove(5)
# set 数学运算
s1 = {1,2}
s2 = {3,4}
#取交集,返回set
s1 & s2 #==> set()
#取并集
s1 | s2 #==> {1,2,3,4}
6. 总结
以上为python中最常用的数据结构,记录备忘。
要深刻理解可变
的含义,注意元组的赋值操作,dict 的key,set 元素的特殊性。