python学习004-容器类型

147 阅读7分钟

1、容器类型是指能存多个变量的类型,比如列表,集合等 有列表list,元祖tuple,字典dict,集合 set

2、列表
创建: 变量名 = [] 或者变量名 = list(可迭代对象)

添加元素:append(元素), insert(下标位置,元素)
定位:变量名[下标]
这种方式可以给指定下标赋值和获取指定下标的数据

遍历元素:
正向:
for 变量名 in 列表变量 语句

反向:
for 索引名 in range(len(列表变量)-1,-1,-1) 列表名[索引名]

删除元素:
列表名.remove(元素) 或者 del 列表名[索引]

字符串转为列表
list01 = str.split(",")根据标志将字符串分割成列表
列表转为字符串[元素需要时字符串,数字会报错]
str = ",".join(list01)

列表的深拷贝和浅拷贝:

1)直接重新赋值给另一个变量 list01=list02,这样list01和list02引用指的是同一个列表,无论对哪个引用进行操作,另一个引用的列表也会改变,本质上是指向同一个列表 2)浅拷贝 list02 = list02[:], 创建一个新列表,第一层元素是基本类型的复制过来,如果第一次元素是容器类型的,比如是再一个列表,那么这里就把列表的引用拷贝过来,这个引用元素就和原来被复制的元素指向同一个列表。改变被拷贝列表第一层中的基本元素不会影响新的列表中该位置的元素,改变列表中引用中的元素,拷贝的列表中元素也会改变,他们是指向同一个地址的。
list01 = ["元素1",["元素2","元素3"]]
list02 = list01[:]

改变list01中元素1,不影响list02中元素1,改变list01中的元素2会影响list02中的元素 3)深拷贝
import copy
list02 = copy.deepcooy(list01) list01和list02完全不影响的,里面的所有元素都是独立的,没有相同的引用指向

3、元组 tuple,里面的元素不可改变,是定死的,只能读取获取
1)创建: 元组名=() 或者 元组名 = tuple()
创建非空元祖
元组名 = (1,2,3) 元组名=tuple(可迭代对象) 元组名 = 100,200,300

2)获取元素 元组名[索引] 从0 开始的

3)遍历:和list列表一样的用法

4、字典 dict:可变的键值对容器 【注意】:键名必须是字符串 创建: 字典名={"键1":值,"键2":值2} 或者 字典宁=dict(可迭代对象)
修改添加键 : 字典名[键1] = 值,没有就创建键,有就给赋值
获取 字典名["键1"]
遍历 : for 键名 : 字典名
字典名[键名]

删除元素 : del 字典宁["键1"]

6集合set:
创建空集合 集合名=set()
创建有默认值的集合 : 集合名 = {1,2,3} 或者 集合名 = set(可迭代对象)
添加元素 集合名.add(元素) 删除元素 集合名.discard(元素) 没有的话不会报错 集合名.remove(元素) 没有元素会报错

6.1集合运算
交集 : & : s1={1,2} s2 = {2,3} s3=s1 & s2 : {2}
并集 : | : 两个集合合并去重
补集- : - : s1-s2 :返回s1中不属于s2的数据
补集^ : ^ : s1 ^ s2 : 返回s1和s2中各自单独元素的并集,也就是s1和s2的并集减去s1和s2的交集
说明 : s1 ^ s2 = (s1-s2) & (s2 - s1)
是否是子集 s1={1,2} s2={1,2,3} s1 < s2 True
是否是超集:s2 > s2 True
相等 == ,两个集合元素个数相等,元素相等 != 两个集合不同,和相等相反 子集或相等 : s1={1,2} s2={2,1} s1 >= s1 True 超集或相等 : s1 <= s2 True

7、推导式
7.1列表推导式: 将可迭代对象转为列表 根据已经存在的列表创建新列表,同时可以指定存在列表中的元素条件
list02 = [item for item in list01 ]
或者加上筛选条件 list02 = [item for item in list01 if item % 3 == 0] 筛选条件根据自己需要
以上相当于用循环来操作的简写

7.2字典推导式
将可迭代对象转为字典
【注意】:for item in 字典名,这里的item获取到的是字典的键名
字典名.values获取到的是字典所有值的列表重复的。 可以用老字典创建新字典
dict02 = {item:dict01[item] for item in dict01} 或者加条件 dict02 = {item:dict01[item] for item in dict01 if 条件} 当然也可以通过k,v来实现,比如
dict02 = {k:v for k,v in dict01.items()}

所以根据上面的特性,将字典转为列表的用法有:
1) list01 = list(dict01) 所有的键列表 2)list01=list(dict01.values()) 所有的值列表 3)list02 = list(dict01.items()) 列表元素是所有的k,v键值对,这里列表中的每个元素是一个元组,元组内第一个元素是键名,第二个元素是值

7.3集合推导式
语法和列表的一样

8、补充说明
【特殊点1】列表list和元组通过下标访问元素的时候,有种特殊情况,默认第一个元素下标是0,但是最后一个下标可以是-1,第一个元素下标可以是 -长度。
所以下标的范围是 【-长度 到 长度-1】

【特殊点2】字符串可以看做是一个存储多个字符的容器,也算是容器

9、容器的通用操作
* 操作 :容器名2 = 容器名1 * 整数 :将容器名1内容复制整数倍数,重新返回给容器名2,老的容器内容不变,除了字典和集合不行,因为字典的键和集合元素是不能重复的。
*= 和上面操作相同

+ 拼接两个容器内容,生成新的容器,同时还是字典和集合不能使用 +=和上面的功能一样

10、其他运算
是否在运算 in 和 是否不在运算 not in 这里注意的是,字典中可以判断的是key值:键值 in 字典

下标运算,访问单个元素 容器名[index] 从零开始,还有最后一个元素可以是-1,这种方式不能访问字典和集合元素,因为他们是无序的。

切片运算:一次访问多个元素,同样字典和集合不能使用: 相当于java中substring操作
语法 [开始下标:结束下标:步长],不包含结束下标,步长表示从开始下标开始每隔步长访问,其他的不访问。列表中说的列表的浅复制其实就是切片运算,只有一个:,没有其他参数 str="我是花果山"
str2 = str[1:3:2] 结果是:是果

注意点: 步长默认是1
开始下标默认是0
结束下标是到最后的 -1 下标是最后一个字符

同样的不适合字典和集合,

特殊:print(message[::-1]) # 圣大天齐山果花是我

比较大小运算:
比较大小只能适用于字符串、列表、元组,
字典不支持,会报错
集合不是比较大小的意思,是集合运算的意思。
字符串、列表和元组是按照同位置,比较同位置的元素的大小,返回第一个不相等元素的比较结果, 如果两个容器所有同位置的元素相等,那么长的容器大。

【注意】:同位置比较的元素必须是同为数字或者同为字符串 【注意】字符串比较的是字符所在的unicode编码的大小

内部函数
len() 返回长度
max() 返回最大数 字典返回的是键 min() 返回最小数 字典返回的是键 sum() 返回所有元素的和,元素必须是数字

ord()返回字符串的unicode编码 odr("a")= 97 只能用于单个字符 chr() 将unicode编码变成字符串 chr(97) = "a" 只能用于单个字符的码

如果想让字符串中没有转义字符,可以在字符串前加上r 比如: r"abcdrf\n\r"这样就没有转义字符了。

字符串格式化: 用法 在字符串中用 "%s,%s" %(参数) 参数个数和前面%s的个数一样,就是简单的替代作用。
其他符号:
%.2d : 取后面参数整数部分,如果小于 2 位就用0在前面补齐,比如参数是1 就是01
%.2f : 取后面参数并保留 2 位小数