第27讲:集合—在我的世界里,你就是唯一

一 可变集合 set

1 概念:集合(set)是一个无序的不重复元素序列。无序不重复的特点决定它存在以下的应用场景:去重处理、关系测试

2 定义/创建:可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

3 语法:parame = {value01,value02,...}  或者   set(value)

4 集合的相关操作:https://www.cnblogs.com/linupython/p/6561700.html

  • 创建:
    • 使用 {} 创建:setname = {element1,element2,...,elementn}      a = {1,2,3,4,5}
    • set()函数创建集合:setname = set(iteration)         b = set([6,7,8,9,10])
  • 访问:
    • 由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素
    • 但是您可以使用 for 循环遍历 set 项目,或者使用 in 关键字查询集合中是否存在指定值
  • 添加:
    • add():添加一个元素到指定的集合,每次只能添加一个。需要注意的是使用 add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表、字典、集合这类可变的数据,否则 Python 解释器会报 TypeError 错误。 a.add(0)
    • update():添加多个元素到指定集合,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。 a.update([2,3,7])
  • 删除:
    • remove():删除集合中指定的对象,一次只能删除一个,如果该对象不存在则报错   a.remove(3)
    • discard():与remove()类似,也是删除指定的对象,一次只能删除一个,但是如果该对象不存在时不报错。    a.discard(0)
    • pop():删除集合中任意一个对象,注意不能指定。   a.pop()
    • clear():清空集合。  a.clear()
    • del语句:彻底删除集合
  • 集合长度:获取集合中元素,通过len方法实现。len(a)
  • 集合的复制:copy() 方法用于拷贝一个集合(重新创建了一个集合)。b = a.copy()

5 判断两个集合关系的内置方法——关系测试常见操作

  • difference()
    • 功能:用于返回集合的差集,即返回的集合元素包含在第一个集合中,但不包含在第二个集合(方法的参数)中。
    • 语法:set1.difference(set2)或set1 - set2
  • issubset()
    • 功能:判断集合set1是否为set2的子集,返回布尔值。
    • 语法:set1.issubset(set2)
  • issuperset()
    • 功能:判断set1是否为set2的父集。
    • 语法:set1.issuperset(set2)
  • isdisjoint()
    • 功能:判断set1和set2是否存在交集, 如果不存在返回True, 存在则返回False.
    • 语法:set1.isdisjoint(set2)
  • symmetric_difference()
    • 功能:返回set1和set2的对称式差集,相当于执行set1.difference(set2)和set2.difference(set1),以新的set集合形式返回set1和set2中差异部分元素(不在两者中同时存在)集合(仅在set1和set2中出现过一次的元素不影响原set1和set2)。
    • 语法:set1.symmetric_difference(set2)或set1 ^ set2
  • symmetric_difference_update()
    • 功能:返回set1和set2的对称式差集,并覆盖更新原set1集合(原来被调用操作的对象),即执行set1 = set1.symmetric_difference(set2)
    • 语法:set1.symmetric_difference(set2)
  • intersection()
    • 功能:交集运算,以set方式返回set1和set2的交集部分(同时存在的元素),不影响原集合set1和set2.
    • 语法:set1.intersection(set2)或set1 & set2
  • intersection_update()
    • 功能:执行交集运算,并将结果覆盖更新原集合set1(原来被调用操作的对象)。
    • 语法:set1.intersection_update(set2)
  • union()
    • 功能:执行并集计算,合并set1和set2中的对象并做去重处理,最后以集合形式返回结果。
    • 语法:set1.union(set2)或set1 | set2
  • <=
    • 功能:判断set1中的每个元素是否都在set2中,即判断set1是否为set2的子集,等同于set1.issubset(set2)
    • 语法:set1 <= set2

二 不可变集合 frozenset()

1 定义:不可变集合就是一个无序的不可变的集合

2 语法:frozenset(value),其中value必须是可迭代对象

3 与集合set的区别:一旦创建就不可以改变。

4 用途:用来作为字典的键

5与tuple的区别:在于无序,元素不可重复,且元素只能是不可变类型

 

三 课后作业

0. 请问集合的唯一作用是什么呢?
答:集合几乎所有的作用就是确保里边包含的元素的唯一性,就像世界上没有两片完全相同的树叶一样,集合内不可能存在两个相同的元素!

1. 如果你希望创建的集合是不变的,应该怎么做?
答:frozenset()

2. 请问如何确定一个集合里边有多少个元素?
答:没错,len()函数正好可以满足你此刻的需求^_^

1 >>> num_set = set([1, 2, 3, 4, 5])
2 >>> len(num_set)
3 5

    
3. 请目测以下代码会打印什么内容?

1 >>> num_set = set([1, 2, 3, 4, 5])
2 >>> num_set[0]

答:会报错,因为集合是无序的。

4. 请问 set1 = {[1, 2]} 和 set1 = set([1, 2]) 执行的结果一样吗?
答:不一样,set1 = set([1, 2]) 会生成一个集合{1, 2},但set1 = {[1, 2]}却会报错。

1 >>> set1 = {[1, 2]}
2 Traceback (most recent call last):
3   File "<pyshell#17>", line 1, in <module>
4     set1 = {[1, 2]}
5 TypeError: unhashable type: 'list'

从报错信息上我们看到“列表不是可哈希类型”,没错,列表是可变的。所以它不可哈希。
其实你再想想就会觉得很有道理,利用哈希函数计算,相同的元素得到的哈希值(存放地址)是相同的,所以在集合中所有相同的元素都会覆盖掉,因此有了集合的唯一性。
然后你继续接着想就觉得更有道理了,通过哈希函数计算的地址不可能是按顺序排放的,所以集合才强调是无序的!

5. 打开你的IDLE,输入set1 = {1, 1.0},你发现了什么?
答:没错, 集合内容是{1.0},其实你弄懂了上一题,这一题一样容易:因为在Python的哈希函数会将相同的值的元素计算得到相同的地址,所以1和1.0是等值的^_^

6. 请问如何给集合添加和删除元素?
答:使用add()方法可以为集合添加元素,使用remove()方法可以删除集合中已知的元素。

1 >>> num1.add(6)
2 >>> num1
3 {0, 1, 2, 3, 4, 5, 6}
4 >>> num1.remove(6)
5 >>> num1
6 {0, 1, 2, 3, 4, 5}

 

 

posted @ 2020-07-23 19:50  洛兰123  阅读(204)  评论(0编辑  收藏  举报