在 python 变量中除了以前文章所提到的整形 int / 浮点数 float / 布尔值 bool / 列表 list / 字典 dict 之外, 还有一个类型我们还没有做详细介绍, 这个变量类型就是集合 set.
一. set 集合简介
python set 集合使用大括号 { }表示, 与字典 dict 不同的是 set 集合并没有 key/value 键值对, 主要有以下两个特点:
1. 元素不允许重复
2.set 不记录元素的添加顺序, 即是无序的, 和字典类似
- # !usr/bin/env python
- # -*- coding:utf-8 _*-
- """
- @Author: 何以解忧
- @Blog(个人博客地址): shuopython.com
- @WeChat Official Account(微信公众号): 猿说 python
- @Github:www.github.com
- @File:python_set.py
- @Time:2019/11/09 21:25
- @Motto: 不积跬步无以至千里, 不积小流无以成江海, 程序人生的精彩需要坚持不懈地积累!
- """
- # 创建一个空集合 set
- set_a = set()
- # 打印集合 set
- print(set_a)
- # 查看类型
- print(type(set_a))
- print("***"*20)
- # 创建一个集合
- set_b = {"猿说 python",False}
- print(type(set_b))
- print(set_b)
- print("***"*20)
- # 创建一个字典
- dict_b = {"name":"猿说 python","url":"www.shuopython.com"}
- print(type(dict_b))
- print(dict_b)
输出结果:
- set()
- <class 'set'>
- ************************************************************
- <class 'set'>
- {
- False, '猿说 python'
- }
- ************************************************************
- <class 'dict'>
- {
- 'name': '猿说 python', 'url': 'www.shuopython.com'
- }
代码分析: 观察上面代码, 虽然字典 dict 和 集合 set 都是由 {} 构成, 注意字典由键值对 key/value 构成, 而集合确是由一个一个数据构成, 和列表的元素类似!
二. set 集合常用函数
add() - 向 set 集合中添加元素;
remove() - 删除元素, 如果集合中不包含被删除的元素, remove() 方法会报出 KeyError 异常;
discard() - 删除元素, 如果集合中不包含被删除的元素, 不会有任何提示或者 异常;
clear() - 就是清空白 set 集合;
copy() - 拷贝一个集合;
difference() - 返回多个集合的差集;
difference_update() - 移除集合中的元素, 该元素在指定的集合也存在;
intersection() - 返回集合的交集, 不改变集合本身, 而是返回两个集合的交集;
intersection_update() - 返回集合的交集, 会通过交集运算改变第一个集合;
isdisjoint() - 判断两个集合是否包含相同的元素, 如果没有返回 True, 否则返回 False;
issubset() - 判断指定集合是否为该方法参数集合的子集;
issuperset() - 判断该方法的参数集合是否为指定集合的子集;
pop() - 随机移除元素;
symmetric_difference() - 移除当前集合中在另外一个指定集合相同的元素, 并将另外一个指定集合中不同的元素插入到当前集合中;
union() - 返回两个集合的并集;
update() - 用于修改当前集合, 可以添加新的元素或集合到当前集合中, 如果添加的元素在集合中已存在, 则该元素只会出现一次, 重复的会忽略;
- # 使用花括号构建 set 集合
- c = {
- '乔峰',"段誉","虚竹","天龙八部","射雕英雄传"
- }
- # 添加元素
- c.add("天山姥姥")
- c.add(6)
- print("c 集合的元素个数为:" , len(c))
- print(c)
- # 删除指定元素
- c.remove("天山姥姥")
- print(c)
- print("c 集合的元素个数为:" , len(c))
- print("***"*20)
- # 判断是否包含指定字符串
- print("c 集合是否包含'乔峰'字符串:" , ("乔峰" in c)) # 输出 True
- print("***"*20)
- # 使用 set()函数 (构造器) 来创建 set 集合
- movies = set()
- movies.add("天龙八部")
- movies.add("射雕英雄传")
- print("movies 集合的元素:" , movies)
- # issubset()方法判断是否为子集合
- print("movies 集合是否为 c 的子集合?", movies.issubset(c)) # 输出 False
- # issuperset()方法判断是否为父集合
- # issubset 和 issuperset 其实就是倒过来判断
- print("c 集合是否完全包含 books 集合?", c.issuperset(movies)) # 输出 False
- # 用 c 集合减去 books 集合里的元素, 不改变 c 集合本身
- result1 = c - movies
- print(result1)
- # difference()方法也是对集合做减法, 与用 - 执行运算的效果完全一样
- result2 = c.difference(movies)
- print(result2)
- # 用 c 集合减去 books 集合里的元素, 改变 c 集合本身
- c.difference_update(movies)
- print("c 集合的元素:" , c)
- # 删除 c 集合里的所有元素
- c.clear()
- print("c 集合的元素:" , c)
- print("***"*20)
- # 直接创建包含元素的集合
- d = {
- "python 面向对象", 'python 基础', 'python 爬虫'
- }
- print("d 集合的元素:" , d)
- # intersection()方法也是获取两个集合的交集, 与用 & 执行运算的效果完全一样
- inter2 = d.intersection(movies)
- print(inter2)
- # 计算两个集合的交集, 改变 d 集合本身
- d.intersection_update(movies)
- print("d 集合的元素:" , d)
- print("***"*20)
- # 将 range 对象包装成 set 集合
- e = set(range(5))
- f = set(range(3, 7))
- print("e 集合的元素:" , e)
- print("f 集合的元素:" , f)
- # 计算两个集合的并集, 不改变 e 集合本身
- un = e.union(f)
- print('e 和 f 执行并集的结果:', un)
- # 计算两个集合的并集, 改变 e 集合本身
- e.update(f)
- print('e 集合的元素:', e)
输出:
c 集合的元素个数为: 7
- {
- '天龙八部', 6, '虚竹', '乔峰', '段誉', '天山姥姥', '射雕英雄传'
- }
- {
- '天龙八部', 6, '虚竹', '乔峰', '段誉', '射雕英雄传'
- }
c 集合的元素个数为: 6
************************************************************
c 集合是否包含'乔峰'字符串: True
************************************************************
movies 集合的元素: {'天龙八部', '射雕英雄传'}
movies 集合是否为 c 的子集合? True
c 集合是否完全包含 books 集合? True
- {
- '乔峰', '段誉', 6, '虚竹'
- }
- {
- '乔峰', '段誉', 6, '虚竹'
- }
c 集合的元素: {6, '虚竹', '乔峰', '段誉'}
c 集合的元素: set()
************************************************************
d 集合的元素: {'python 爬虫', 'python 基础', 'python 面向对象'}
set()
d 集合的元素: set()
************************************************************
e 集合的元素: {0, 1, 2, 3, 4}
f 集合的元素: {3, 4, 5, 6}
e 和 f 执行并集的结果: {0, 1, 2, 3, 4, 5, 6}
e 集合的元素: {0, 1, 2, 3, 4, 5, 6}
三. set 集合运算符
<=: 相当于调用 issubset() 方法, 判断前面的 set 集合是否为后面的 set 集合的子集合.
>=: 相当于调用 issuperset() 方法, 判断前面的 set 集合是否为后面的 set 集合的父集合.
-: 相当于调用 difference() 方法, 用前面的 set 集合减去后面的 set 集合的元素.
&: 相当于调用 intersection() 方法, 用于获取两个 set 集舍的交集.
^: 计算两个集合异或的结果, 就是用两个集合的并集减去交集的元素.
- # 使用花括号构建 set 集合
- c = {
- '乔峰',"段誉","虚竹","天龙八部","射雕英雄传"
- }
- # 使用 set()函数 (构造器) 来创建 set 集合
- movies = set()
- movies.add("天龙八部")
- movies.add("射雕英雄传")
- print("movies 集合的元素:" , movies)
- # issubset()方法与<= 运算符效果相同
- print("movies 集合是否为 c 的子集合?", (movies <= c)) # 输出 False
- print("***"*20)
- e = set(range(5))
- f = set(range(3, 7))
- print("e 集合的元素:" , e)
- print("f 集合的元素:" , f)
- # 对两个集合执行异或运算
- xor = e ^ f
- print('e 和 f 执行 xor 的结果:', xor)
- # 直接创建包含元素的集合
- d = {
- "python 面向对象", 'python 基础', 'python 爬虫'
- }
- print("d 集合的元素:" , d)
- # 计算两个集合的交集, 不改变 d 集合本身
- inter1 = d & movies
- print(inter1)
输出结果:
movies 集合的元素: {'天龙八部', '射雕英雄传'}
movies 集合是否为 c 的子集合? True
************************************************************
e 集合的元素: {0, 1, 2, 3, 4}
f 集合的元素: {3, 4, 5, 6}
e 和 f 执行 xor 的结果: {0, 1, 2, 5, 6}
d 集合的元素: {'python 基础', 'python 面向对象', 'python 爬虫'}
set()
来源: http://www.bubuko.com/infodetail-3346788.html