zoukankan      html  css  js  c++  java
  • 第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}
  • 相关阅读:
    C#CreateGraphics方法的三种实现方式
    二叉树的性质和常用操作代码集合
    《Java程序设计基础》 第8章手记Part 2
    《Java程序设计基础》 第8章手记Part 1
    STL 算法罗列 (转)
    STL 练习
    STL所有算法简介 (转) http://www.cnblogs.com/yuehui/archive/2012/06/19/2554300.html
    linux 解压命令
    杭电1016
    杭电1257
  • 原文地址:https://www.cnblogs.com/luoxun/p/13368333.html
Copyright © 2011-2022 走看看