集合 字符编码

て烟熏妆下的殇ゞ 提交于 2020-03-12 13:45:08

一.集合

一)作用:集合 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、文本文件存取乱码问题
存乱了:解决方法是,编码格式应该设置成支持文件内字符串的格式
取乱了:解决方法是,文件是以什么编码格式存如硬盘的,就应该以什么编码格式读入内存

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!