day08 集合&文件处理

01.集合

1.作用

集合、list、tuple、dict一样都可以存放多个值,但是集合主要用于:去重、关系运算

2.定义

定义:在{}内用逗号分隔开多个元素,集合具备以下三个特点:
1:每个元素必须是不可变类型
2:集合内没有重复的元素
3:集合内元素无序
s = {1,2,3,4} # 本质 s = set({1,2,3,4})

PS:

1:列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值,而集合类型既没有索引也没有key与值对应,所以无法取得单个的值,而且对于集合来说,主要用于去重与关系元素,根本没有取出单个指定值这种需求。
注意
2:{}既可以用于定义dict,也可以用于定义集合,但是字典内的元素必须是key:value的格式,现在我们想定义一个空字典和空集合,该如何准确去定义两者?
d = {} # 默认是空字典
s = set() # 这才是定义空集合

3.类型转换

但凡能被for循环的遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()转换成集合类型

s = set([1,2,3,4])
s1 = set((1,2,3,4))
s2 = set({'name':'jason',})
s3 = set('egon')
print(s,s1,s2,s3)

4.使用

①关系运行符

有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
  pythons={'cici','lihua','bob','kiki','xiaohua'}
  linuxs={'tom','cici','lili','lihua','jack'}
图片.png

(1).交集:取两个集合的共同部分-->即报名Python又报名Linux的学生
print(pythons &linuxs)
{'lihua', 'cici'}
(2).并集合:两个集合并到一起-->所有学生的姓名
print(pythons | linuxs)
{'lihua', 'cici', 'tom', 'kiki', 'jack', 'lili', 'xiaohua', 'bob'}
(3).差集:一个集合减去另一个集合共同的部分
只学了Python的学生:
print(pythons - linuxs)
{'bob', 'kiki', 'xiaohua'}
只学了Linux的学生:
print(linuxs - pythons)
{'jack', 'lili', 'tom'}
(4).交叉补集/对称差集:两个集合互相减然后并到一起,取同时没有学两门课程的学生。
print(linuxs^pythons)
{'xiaohua', 'lili', 'kiki', 'bob', 'jack', 'tom'}
(5)值是否相等
print(linuxs == pythons)
False

(6)父集:一个集合是否包含另外一个集合
6.1 包含则返回True
print({1,2,3} > {1,2})
True
print({1,2,3} >= {1,2})
True
6.2 不存在包含关系,则返回False
print({1,2,3} > {1,3,4,5})
False
print({1,2,3} >= {1,3,4,5})
False

(7)7.子集
print({1,2} < {1,2,3})
True
print({1,2} <= {1,2,3})
True

②去重

PS:

  1. 只能针对不可变类型
  2. 集合本身是无序的,去重之后无法保留原来的顺序

l=['a','b',1,'a','a']
s = set(l) #将列表转成集合
print(set(s))

l_new = list(s)#再将集合转成列表
print(l_new)
[1, 'a', 'b'] #去了重复打乱了顺序

针对不可变类型,并且保证顺序则需要我们自己写代码实现,例如
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'}
]

③其他操作

1、update()
.>>> s1 = {1,2,3}
.>>> s1.update({3,4,5})
.>>> s1

2、add()
.>>> s1 = {1,2,3}
.>>> s1.add(6)
.>>> s1

3、删除
.>>> s1 = {11,22,33,44,55,"xx","yy","zz","aa"}
.>>> s1.remove(3)
Traceback (most recent call last):
File "", line 1, in
.KeyError: 3
.>>> s1.remove(33)
.>>> s1
{'yy', 11, 44, 'aa', 22, 55, 'zz', 'xx'}
.>>> s1.discard(33333)
.>>> s1
{'yy', 11, 44, 'aa', 22, 55, 'zz', 'xx'}
.>>> s1.discard('yy')
.>>> s1
{11, 44, 'aa', 22, 55, 'zz', 'xx'}
.>>> s1.pop()
11
.>>> s1

.>>> s1.clear()
.>>> s1
set()

4.copy()
.>>> s1 = {11,22,33,44,55,"xx","yy","zz","aa"}
.>>> s1.copy()

5.s1.isdisjoint()
.>>> s1 = {1,2,3}
.>>> s2 = {3,4,5,6}
.>>> s1.isdisjoint(s2)
False

6.长度
.>>> s={'a','b','c'}
.>>> len(s)
3

7.成员运算
.>>> 'c' in s
True

8.循环
.>>> for item in s:
... print(item)
...
c
a
b

总结:

存多个值,可变,无序

.>>> s1 = {1,2,3}
.>>> id(s1)
31828672
.>>> s1.add(4)
.>>> id(s1)
31828672
.>>> s1

02.文件处理

1.什么是文件

文件是操作系统提供给用户或者应用程序操作硬盘的一种机制

2.为何要用文件

读写文件----->存取硬盘

应用程序: open()
操作系统: 打开文件
计算机硬件: 硬盘空间

3.如何用文件

打开文件
读/写
关闭文件

f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f

data=f.read()
调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作

f.close()
向操作系统发起关闭文件的请求,回收系统资源

4.资源回收与with上下文管理

打开一个文件包含两部分资源:应用程序的变量f和操作系统打开的文件。在操作完毕一个文件时,必须把与该文件的这两部分资源全部回收,回收方法为:

f.close() #回收操作系统打开的文件资源
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)

5.指定操作文本文件的字符编码

f = open(...)
是由操作系统打开文件,如果打开的是文本文件,会涉及到字符编码问题。

如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。

f = open('a.txt','r',encoding='utf-8')

posted @ 2020-12-24 20:21  小熊渣渣  阅读(80)  评论(0)    收藏  举报