集合类型

一、基本数据类型:集合

  1、作用:用来做关系运算和去重

  2、定义:在{ }内用逗号分隔开多个元素,多个元素满足以下三个条件:

        ①:集合内元素必须为不可变类型

        ②:集合内元素无序  

        ③:集合内元素没有重复

    空集合:s = set()

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

s = set([1,2,3,4])            # 列表
s1 = set((1,2,3,4))           # 元组  
s2 = set({'k1':'XXX',})      # 字典
s3 = set(‘hahaha’)            # 字符串

   4、内置方法:

    1、取交集:

friends1 = {"zero","kevin","jason","egon"}
friends2 = {"Jy","ricky","jason","egon"}

#取共同好友:
res=friends1 & friends2
#相同语法:
print(friends1.intersection(friends2))

      2、取并集/合集:

#两者所有的好友:
print(friends1 | friends2)
#相同语法:
print(friends1.union(friends2))

      3、取差集:

#取friends1独有的好友:
print(friends1 - friends2)
#相同语法:
print(friends1.difference(friends2))

#取friends2独有的好友:
print(friends2 - friends1)
#相同语法:
print(friends2.difference(friends1))

      4、取对称差集:

#求两个用户独有的好友们(即去掉共有的好友):
print(friends1 ^ friends2)
#相同语法:
print(friends1.symmetric_difference(friends2))

      5、父子集(包含关系):

s1={1,2,3}
s2={1,2,4}
#不存在包含关系,下面比较均为False
print(s1 > s2)
print(s1 < s2)

s1={1,2,3}
s2={1,2}
print(s1 > s2) # 当s1大于或等于s2时,才能说是s1是s2他父集
print(s1.issuperset(s2)) 
print(s2.issubset(s1)) # s2 < s1  =>True

s1={1,2,3}
s2={1,2,3}
print(s1 == s2) # s1与s2互为父子
print(s1.issuperset(s2))
print(s2.issuperset(s1))

    6、去重:

      局限性: 1. 只能针对不可变类型

           2. 集合本身是无序的,去重之后无法保留原来的顺序

l=['a','b',1,'a','a']
s=set(l)  # 将列表转成了集合
{'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'}
]

      7、其他内置方法:

s={1,2,3}
#需要掌握的内置方法1:discard
s.discard(4) # 删除元素不存在do nothing
print(s)
s.remove(4) # 删除元素不存在则报错

#需要掌握的内置方法2:update
s.update({1,3,5})
print(s)

#需要掌握的内置方法3:pop
res=s.pop()
print(res)

#需要掌握的内置方法4:add
s.add(4)
print(s)


#其余方法了解
res=s.isdisjoint({3,4,5,6}) # 两个集合完全独立、没有共同部分,返回True
print(res)

#了解
s.difference_update({3,4,5}) # s=s.difference({3,4,5})
print(s)

          8、其他操作:

# 1.长度
 s={'a','b','c'}
print(len(s))
3

# 2.成员运算
'c' in s
True

# 3.循环
for item in s:
     print(item)

 二、字符编码:

    1、什么是字符编码:

      字符编码也称字集码,是把字符集中的字符编码为指定集合中某一对象以便文本在计算机中存储和通过通信网络的传递。

       人类在与计算机交互时,用的都是人类能读懂的字符,如中文字符、英文字符、日文字符等而计算机只能识别二进制数。

       所以必须经历次历程:

                               

    2、为什么要了解字符编码:

      字符串类型、文本文件的内容都是由字符组成的,但凡涉及到字符的存取,都需要考虑字符编码的问题。

      3、计算机底层知识储备:

        3.1 三大核心硬件:

      

#1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的

#2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行

#3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘

        3.2 :文本编辑器读取文件内容的流程:

          1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)

          2、文件编辑器会将文件内容从硬盘读入内存

          3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上

        3.3 :python解释器执行文件的流程:

          1、启动python解释器,此时就相当于启动了一个文本编辑器

          2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中

          3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法

        两者区别:前两步相同,最后一步不相同,一个是显示在屏幕上,一个则是解释执行语法!
      
     3.4 发展历史:
        1.美国最先诞生了ASCII码表:
    
     ASCII表的特点:
    

        1、只有英文字符与数字的一一对应关系
          2、一个英文字符对应1Bytes1Bytes=8bit8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符

      
2.中国人定制了GBK
        
      GBK表的特点:
          1、只有中文字符、英文字符与数字的一一对应关系
          2、一个英文字符对应1Bytes
             一个中文字符对应2Bytes   
             补充说明:
             1Bytes=8bit8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
             2Bytes=16bit16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符

      3.unicode于1990年开始研发,1994年正式公布,具备两大特点:

       
 
1. 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符

        2. 与传统的字符编码的二进制数都有对应关系,详解如下:
          很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。此处需要强
           调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码
            的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的
             编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生
              的缘由

          
      本编辑器输入任何字符都是最新存在于内存中,是unicode编码的,存放于硬盘中,则可以转换成任意
       其他编码,只要该编码可以支持相应的字符

        4.编码与解码:
        
由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
              
      由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode

             utf-8是针对Unicode的可变长度字符编码:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储

          unicode更像是一个过渡版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,等过去几十年,所有老编码的文件都淘汰
          掉之后,会出现一个令人开心的场景,即硬盘里放的都是utf-8格式,此时unicode便可以退出历史舞台,内存里也改用utf-8
          天下重新归于统一

        6.编码应用
          主要目的:防止乱码!!
              
                1、内存中固定使用unicode无论输入任何字符都不会发生乱码

             2、我们能够修改的是存/取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种:存乱了,读乱了

              2.1 存乱了:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符
                 在shift_jis中没有找到对应关系而导致存乱了                2.2 读乱了:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了
 
               1. 保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式

           2. 保证存的时候不乱:在由硬盘读入内存时,必须采用与写入硬盘时相同的编码格式

  

 

 

原文地址:https://www.cnblogs.com/qjk95/p/12469016.html