一、简介
Python中自带有几类常见的数据结构,元组、列表、字典、集合。
二、元组
1、定义
#元组是一个固定长度,不可改变的Python序列对象。
2、特点
#长度一旦确定,则不可改变
#内容一旦确定,则不可改变。特殊情况,当它的某个元素本身的内容是可变的,则可以 改 变该元素其中的内容
3、创建
tup = 4, 5, 6 或 tup = (4, 5, 6) #当使用复杂表达式定义元组时,需要使用圆括号
tuple([4, 5, 6]) #使用tuple可以将任意序列或迭代器转换成元组
4、访问
tup[0] #下标访问,从0开始
5、运算
(1, 2) + (3, 4) = (1,2,3,4) #连接两个数组
(1,2)* 2 = (1,2,1,2) #复制多倍
6、自动拆分
tup = (4,5,6)
a,b,c = tup #系统会试图拆分等号右边的值,更复杂的也是。
a,b = b,a #特殊用法:用于交换两个变量的值
#变量拆分用于迭代元组或列表序列
#用于函数返回多个值
values = 1,2,3,4,5,6 #复杂的拆分功能
a,b,*_ = values #取前几个元素
a = 1,b = 2, _ = [ 3,4,5,6 ] #剩下的是列表
7、方法
values.count(2) #统计元组中某个元素出现的次数
三、列表
1、定义
#与元组类似,特点及定义方式不同
2、特点
#列表长度可变
#内容可以被修改
3、创建
list1 = [1, 2, 3] #用方括号定义
list2 = list(tup) #将元组等转换成列表
list = list(range(10) #常用来在数据处理中实体化迭代器或生成器
4、修改和访问
list1[1] = 4 #通过下标修改
list1[1] #通过下标访问
5、添加和删除
list1.append('asdf') #列表末尾添加元素
list1.insert(1, 'red') #指定位置插入元素,插入的序号在0到列表长度之间
#insert 耗费的计算量很大,需要进行元素的移动
list1.pop(2) #移除并返回指定位置的元素,insert() 逆运算
list1.remove(1) #移除第一次出现的指定元素
#使用 in 和 not in 可以检查列表中是否包含或不包含某个元素,速度很慢,因为线性搜索
6、运算
[1,2,3] + [4,5,6] = [1,2,3,4,5,6] #串联两个列表,计算量大
x = [1,2,3]
x.extend([4,5,6]) #extend() 追加多个元素
7、排序
#使用sort()函数进行原地排序
#sort函数可以加参数 ,对字符串按长度进行排序 b.sort(key = len)
8、二分搜索和维护已排序的列表
bisect.bisect(c, 2) #检查已排好序列表中插入某元素的位置
bisect.insert(c, 2) #向已排好序的列表中插入某元素
9、切片
#选择序列元素的一部分
seq[start : end : step ] #格式,包含的元素个数位end-start,不包括结束元素;start和end均可省略,默认为序列的开头和结尾;step表示步进,可选参数。
#切片也可被赋值
seq[-6, -2] #负数表示向后切片,且end位置终点为-1,不是 0。
seq[ : : -1 ] #逆置列表或元组
10、序列函数
# enumerate 函数可以返回(i, value)元组序列
# sorted 函数可以返回一个新的排好序的列表,同sort 函数相同的参数
# zip 函数可以将多个列表、元组或其他序列成对组合成一个元组列表
f, l = zip(*列表名) # zip 可以用来解压序列,也可以把行的列表转换成列的列表
#reversed 函数可以从后向前迭代一个序列,是一个生成器
四、字典
1、定义
#又称哈希映射或关联数组,是键值对的大小可变集合,键和值都是Python对象。
# keys 和 values 是字典的键和值的迭代器方法
2、创建
d1 = { 'a' : 1, 'b' : [1,2,3] } #使用尖括号
#使用两个序列组合成字典 使用 zip
mapping = dict(zip(range(5), reversed(range(10))))
3、访问、插入
#同元组和列表,其中可以使用get(key, default_value) 获取
d1.setdefault(letter, []).append(word) #简化 if - else 操作
#使用 in 检查字典中是否包含某个键
4、删除
del d1[键名] #只删除
d1.pop(键名) #删除键值对并返回值
5、运算
d1.update({ 'b' : 'foo' }) #可以将两个字典进行融合,原地改变,相同键的值会被覆盖掉
6、有效的键类型
#键通常需要是不可变的标量类型(整数、浮点数、字符串)或元组(元组中的对象也必须
是不可变的),称为“可哈希性”,使用 hash函数 检测一个对象是否是可哈希的
五、集合
1、定义
是(无序)的(不可重复)的元素的集合。
2、特点
#序列无须
#类似字典,只有键没有值
3、创建
set([1,2,3]) #使用set转换
{1,2,3} #使用尖括号,同字典,但内部元素组织不同
4、运算
add() #添加元素
clear() #清空元素
remove() #移除元素
pop() #去除任意元素
a.union(b) or a | b #合并 a.update(b) or a |= b #合并并放入a中
a.intersection(b) or a & b #交集 a.intersection)_update(b) or a &= b #交集放入a中
a.difference(b) or a - b #差集,留下a中特有的元素 a.difference_update(b) or a -= b
a.symmetric_difference(b) or a^b #只在a或b中的元素
a.symmetric_difference_update(b) or a^=b #只在a或b中的元素放入a中
a.issubset(b) #如果a中元素全部属于b,则为true
a.issuperset(b) #如果b中元素全部属于a,则为true
a.isdisjoint(b) #如何a、b中无共同元素,则为true
{1,2,3} = {3,2,1} #集合的内容相同时,集合才对等
六、列表、集合、字典推导式
1、定义
#允许用户从集合中过滤元素,形成列表,参数传递的过程中还可以修改元素。
#列表形式 :list_comp = [ expression for val in collection if condition ]
#集合形式 :set_comp = { expr for key in collection if condition }
#字典形式 :dict_comp = { key-expr : value-expr for value in collection if condition }
2、进阶 -- 嵌套列表推导式
#将两重for循环进行整合,for表达式的顺序与嵌套for循环的顺序是一样的。