一.集合
一)作用:集合 list tuple dict一样都可以存放多个值,但实际和主要用于:去重 关系运算
二)定义:在{}内用逗号分隔开多个元素,集合具备以下三个特点:
1:每个元素必须是不可变类型
2:集合内没有重复的元素
3:集合内元素无序
1 s = {1,2,3,4} # 本质 s = set({1,2,3,4})
# 注意1:列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值,而集合类型既没有索引也没有key与值对应,所以无法取得单个的值,而且对于集合来说,主要用于去重与关系元素,根本没有取出单个指定值这种需求。
# 注意2:{}既可以用于定义dict,也可以用于定义集合,但是字典内的元素必须是key:value的格式,现在我们想定义一个空字典和空集合,该如何准确去定义两者?
d = {} # 默认是空字典
s = set() # 这才是定义空集合
三)类型转换:
但凡能被for循环的遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()转换成集合类型
1 >>> s = set([1,2,3,4]) 2 >>> s1 = set((1,2,3,4)) 3 >>> s2 = set({'name':'jason',}) 4 >>> s3 = set('egon') 5 >>> s,s1,s2,s3 6 {1, 2, 3, 4} {1, 2, 3, 4} {'name'} {'e', 'o', 'g', 'n'}
四)
1)关系运算
我们定义两个集合S1与S2分别存放两个相同的名字:
1 S1={'小明','小美','小红','小燕'} 2 S2={'小文','小琴','小红','小燕'}
关系图如下:
1 # 1.合集(|):求两个用户所有的好友(重复好友只留一个) 2 >>> friends1 | friends2 3 {'小明','小美','小红','小燕','小文','小琴'} 4 5 # 2.交集(&):求两个用户的共同好友 6 >>> S1& S2 7 {'小红','小燕''} 8 9 # 3.差集(-): 10 >>> S1- S2# 求用户1独有的好友 11 {'小明','小美'} 12 >>> friends2 - friends1 # 求用户2独有的好友 13 {'小文','小琴'} 14 15 # 4.对称差集(^) # 求两个用户独有的好友们(即去掉共有的好友) 16 >>> friends1 ^ friends2 17 {'小明','小美','小文','小琴'} 18 19 # 5.值是否相等(==) 20 >>>S1 == S2 21 False 22 23 # 6.父集:一个集合是否包含另外一个集合 24 # 6.1 包含则返回True 25 >>> {1,2,3} > {1,2} 26 True 27 >>> {1,2,3} >= {1,2} 28 True 29 # 6.2 不存在包含关系,则返回True 30 >>> {1,2,3} > {1,3,4,5} 31 False 32 >>> {1,2,3} >= {1,3,4,5} 33 False 34 35 36 # 7.子集 37 >>> {1,2} < {1,2,3} 38 True 39 >>> {1,2} <= {1,2,3} 40 True
2.去重
1 1、只能针对不可变类型去重 2 print(set([1,1,1,1,2])) 3 4 2、无法保证原来的顺序 5 l=[1,'a','b','z',1,1,1,2] 6 l=list(set(l)) 7 print(l) 8 9 10 l=[ 11 {'name':'lili','age':18,'sex':'male'}, 12 {'name':'jack','age':73,'sex':'male'}, 13 {'name':'tom','age':20,'sex':'female'}, 14 {'name':'lili','age':18,'sex':'male'}, 15 {'name':'lili','age':18,'sex':'male'}, 16 ] 17 new_l=[] 18 for dic in l: 19 if dic not in new_l: 20 new_l.append(dic) 21 22 print(new_l)
3.其他操作方法
1 其他内置方法 2 s={1,2,3} 3 需要掌握的内置方法1:discard 4 s.discard(4) # 删除元素不存在do nothing 5 print(s) 6 s.remove(4) # 删除元素不存在则报错 7 8 9 需要掌握的内置方法2:update 10 s.update({1,3,5}) 11 print(s) 12 13 需要掌握的内置方法3:pop 14 res=s.pop() 15 print(res) 16 17 需要掌握的内置方法4:add 18 s.add(4) 19 print(s)
其余方法全为了解res=s.isdisjoint({3,4,5,6}) # 两个集合完全独立、没有共同部分,返回Trueprint(res)了解s.difference_update({3,4,5}) # s=s.difference({3,4,5})print(s)二.字符编码
分析过程
x="上"
内存
上-------翻译-----》0101010
上《----翻译《-----0101010
字符编码表就是一张字符与数字对应关系的表
a-00
b-01
c-10
d-11
ASCII表:
1、只支持英文字符串
2、采用8位二进制数对应一个英文字符串
GBK表:
1、支持英文字符、中文字符
2、
采用8位(8bit=1Bytes)二进制数对应一个英文字符串
采用16位(16bit=2Bytes)二进制数对应一个中文字符串
unicode(内存中统一使用unicode):
1、
兼容万国字符
与万国字符都有对应关系
2、
采用16位(16bit=2Bytes)二进制数对应一个中文字符串
个别生僻会采用4Bytes、8Bytes
unicode表:
内存
人类的字符---------unicode格式的数字----------
| |
| |
|
硬盘 |
|
| |
| |
GBK格式的二进制 Shift-JIS格式的二进制
老的字符编码都可以转换成unicode,但是不能通过unicode互转
utf-8:
英文->1Bytes
汉字->3Bytes
结论:
1、内存固定使用unicode,我们可以改变的是存入硬盘采用格式
英文+汉字-》unicode-》gbk
英文+日文-》unicode-》shift-jis
万国字符》-unicode-》utf-8
2、文本文件存取乱码问题
存乱了:解决方法是,编码格式应该设置成支持文件内字符串的格式
取乱了:解决方法是,文件是以什么编码格式存如硬盘的,就应该以什么编码格式读入内存
来源:https://www.cnblogs.com/2722127842qq-123/p/12468523.html