集合类型/数据类型总结/文件处理初步了解
集合类型
集合(set)用途
(1).去重
(2).关系运算
定义方式
在{}内逗号分科开多个元素,集合内元素的特点有三个
(1)每一个元素都是不可变类型
(2)集合内元素不能重复
(3)集合内元素无序、
#s = {11,3.1,"xxx",(1,2,3),}
#如果用集合方式 添加元素 添加可变类型会报错 ,所以说在现有的数据类型当中
可以在集合当中的有 整型、浮点型、字符串、元组 ------>不可变类型
像 列表、字典 都不可以用集合类型-------->可变类型
数据类型转换
# 但凡能被for循环的遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()转换成集合类型
>>> s = set([1,2,3,4])
>>> s1 = set((1,2,3,4))
>>> s2 = set({'name':'jason',})
>>> s3 = set('egon')
>>> s,s1,s2,s3
{1, 2, 3, 4} {1, 2, 3, 4} {'name'} {'e', 'o', 'g', 'n'}
集合set去重
集合去重复有局限性
1、只针对不可变类型
2、集合本身是无序的,去重之后无法保存原来的顺序
>>> l=['a','b',1,'a','a']
>>> s=set(l)
>>> s # 将列表转成了集合
{'b', 'a', 1}
>>> l_new=list(s) # 再将集合转回列表
>>> l_new
['b', 'a', 1] # 去除了重复,但是打乱了顺序
#那么我们应该怎么去重复呢?
# 针对不可变类型,并且保证顺序则需要我们自己写代码实现,例如
l=[
{'name':'lili','age':18,'sex':'male'},
{'name':'jack','age':73,'sex':'male'},
{'name':'tom','age':20,'sex':'female'},
{'name':'lili','age':18,'sex':'male'},
{'name':'lili','age':18,'sex':'male'},
]
new_l=[]
for dic in l:
if dic not in new_l:
new_l.append(dic)
print(new_l)
# 结果:既去除了重复,又保证了顺序,而且是针对可变类型的去重
[
{'age': 18, 'sex': 'male', 'name': 'lili'},
{'age': 73, 'sex': 'male', 'name': 'jack'},
{'age': 20, 'sex': 'female', 'name': 'tom'}
]
集合set关系运算
交集、并集、差集、对称差集、父子集
pythons ={"william","egon","lili","lxx","xxx"}
linuxs ={"william","egon","lili","lxx","jay","yay","wow"}
1、交集
两个集合之间重复的元素
print(pythons&linuxs)
>>>{'lili', 'egon', 'lxx', 'william'}
#方式二: set.intersection(set)
print(pythons.intersection(linuxs))
>>>{'lxx', 'egon', 'lili', 'william'}
2、并集
两个集合合并到一起
print(pythons|linuxs)
>>>{'jay', 'lxx', 'wow', 'yay', 'xxx', 'william', 'lili', 'egon'}
#方式二 set.union(set)
print(pythons.union(linuxs))
>>>{'lili', 'jay', 'egon', 'william', 'yay', 'wow', 'lxx', 'xxx'}
3、差集
一个集合见到与另一个集合共同的部分 / 两个集合每个集合内不重复元素 / 该集合不同于另一个集合的所有元素
print(pythons-linuxs) # “-”左边代表判断该集合的主体 另一边是参考集合
# >>>{'xxx'} #主体集合与 参考集体差异的元素有哪些
print((linuxs-pythons))
# >>>{'yay', 'jay', 'wow'}
#方式二 set.difference(set)
print(pythons.difference(linuxs))
#>>>{'xxx'}
print(linuxs.difference(pythons))
>>>{'yay', 'jay', 'wow'}
4、对称差集 \交叉补集
两个集合内各自不同于另一个集合 元素合并到一起
res=(pythons -linuxs) | (linuxs-pythons)
print(res)
# >>>{'jay', 'yay', 'xxx', 'wow'}
print(pythons^linuxs) #简便方法
# >>>{'yay', 'wow', 'jay', 'xxx'}
#方式二 set.symmetric_difference(set)
print(pythons.symmetric_difference(linuxs))
>>>{'yay', 'xxx', 'jay', 'wow'}
5、父子集
当一个集合完全包含另外一个集合的所有元素,称为该集合为另一个集合的父集
这里面的大于等于是指的包含关系
let1={"william",'shidifen','daerwen'}
let2={"william",'shidifen'}
print(let1>=let2)
# >>>True
print(let2<=let1)
# >>>True
集合set常用操作
1、set长度
let1={"william",'shidifen','daerwen'}
print(len(let1))
>>>3
2、成员运算in 和 not in
let1={"william",'shidifen','daerwen'}
print("william" in let1)
# >>>True
print(1 in let1)
# >>>False
集合set .方法
1、set.update()
s1={1,2,3,}
# s1.update({3,4,5}) # 更新集合 会把新集合添加到 原集合中去
# print(s1)
>>>{1, 2, 3, 4, 5}
2、set.add()
s1={1,2,3,}
s1.add(4) # 添加单个元素 到集合
print(s1)
>>>{1, 2, 3, 4}
3、set.remove
指定元素删除 如果该集合内没有该元素则会报错
s1={1,2,3,}
s1.remove(1) # 指定元素删除#如果没有会报错
print(s1)
>>>{2, 3}
4、 set.discard
指定元素删除 该集合内没有该元素也不会报错
s1={1,2,3,}
s1.discard(4)
print(s1) #指定元素删除 没有不会报错
5、set.pop
在集合中也能有这种方法删除 但是在集合中没有参数选项,不能指定参数,所以就变成了随机删除
6、 set.clear
清空集合
s1={1,2,3,}
s1.clear()
print(s1)
>>>set()
集合set总结
可以存放多个值 值无序 是可变类型
# 存一个值or存多个值
# 多个值
# 有序or无序
# 无序
# 可变or不可变(1、可变:值变,id不变。可变==不可hash 2、不可变:值变,id就变。不可变==可hash)
# 可变
数据类型总结
存储空间占用从低到高
数字
字符串
集合:无序,即无序存索引相关信息
元组:有序,需要存索引相关信息,不可变
列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改
存一个值还是多个值,存多个称做容器
标量/原子类型 | 数字,字符串 |
---|---|
容器类型 | 列表,元组,字典 |
按可变不可变
可变类型 | 不可变类型 |
---|---|
列表 | 整型 |
字典 | 浮点型 |
字符串 | |
元组 |
按访问顺序区分
直接访问 | 数字 |
---|---|
顺序访问 | 字符串,列表,元组 |
key值访问(映射类型) | 字典 |
end
文件处理
引入
**1、什么是文件 **
文件时操作系统提供给用户或者应用程序操作硬盘的一种机制
2、为何用文件
读写文件 -------->存取硬盘
3、如何用文件
打开文件
读/写
关闭文件
文件操作的基本流程
1.1基本流程
# open("路径")
f=open(r"路径",mode="rt",encoding="Utf-8")
# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()
1.2资源回收与上下文管理
打开一个文件包含两部分资源:应用程序的变量f和操作系统打开的文件。在操作完毕一个文件时,必须把与该文件的这两部分资源全部回收,回收方法为:
1、f.close() #回收操作系统打开的文件资源
2、del f #回收应用程序级的变量
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件无法关闭,白白占用资源, 而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close(),虽然我们如此强调,但是大多数读者还是会不由自主地忘记f.close(),考虑到这一点,python提供了with关键字来帮我们管理上下文
# 1、在执行完子代码块后,with 会自动执行f.close()
with open('a.txt','w') as f:
pass
# 2、可用用with同时打开多个文件,用逗号分隔开即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data = read_f.read()
write_f.write(data)
1.3指定操作文本文件的字符编码
f = open(...)是由操作系统打开文件,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f = open('a.txt','r',encoding='utf-8')
.....