set是python中一个无序且无重复元素的数据结构。无序,是因为set采用了hash技术进行元素的存储;无重复元素,本身就是set区别其他数据结构的一个重要特点,也是set之间能够进行并,交,差等各种集合运算的基础。set主要有两大类的操作。

(1)set本身的操作

1.初始化
s0 = {1, 2, 3}s1 = set()s2 = set('set')s3 = set([1, 2, 3])s4 = set((1, 2, 3))print(s0, s1, s2, s3, s4, sep='\n')
输出结果:
{1, 2, 3}
set()
{'s', 't', 'e'}
{1, 2, 3}
{1, 2, 3}

注意:set与dict一样使用{}来表示,但s={}创建的是空dict,不是创建空set。创建一个空set需要使用s=set()。

字符串str、列表list、元组tuple可以直接转换成set。

2.新增元素add和update

s = {1, 2, 'a', 5, 'b'}s.add(7)print(s)s.add('a')print(s)s.add('ab')print(s)
输出结果:
{1, 2, 5, 'a', 7, 'b'}
{1, 2, 5, 'a', 7, 'b'}
{1, 2, 5, 'a', 7, 'ab', 'b'}

可以看出:1)如果新增的元素在原set已存在,则什么都不发生。2)add只是增加一个元素,所以即使一个字符串含有多个字符,也不会像初始化那样进行拆分。3)添加结果是无序的,并不一定是添加到尾部。
a = {1, 2, 3, 'a', 'b', 'c'}b = 'xyz'c = {'xyz', 'abc'}a.update(b)print(a)a.update(c)print(a)
输出结果:
{'b', 1, 2, 3, 'a', 'x', 'z', 'y', 'c'}
{'b', 1, 2, 3, 'xyz', 'a', 'abc', 'x', 'z', 'y', 'c'}

可以看出:1)update是批量的添加多个元素或集合;2)添加结果是无序的,并非是添加到尾部。

3.删除元素remove/discard/pop/clear

s = {1, 2, 3, 'a', 'b', 'c'}s.remove(1)print(s)s.discard('a')print(s)s.pop()print(s)s.clear()print(s)
输出结果:
{2, 3, 'c', 'a', 'b'}
{2, 3, 'c', 'b'}
{3, 'c', 'b'}
set()

删除元素有remove,discard,pop,clear操作。可以看出,clear是清空集合,使得集合重置为空;

pop是任意选一个元素删除,并返回这个元素的值,clear和pop都没有输入参数;remove和discard都是删除一个指定的元素,区别是如果该元素不存在集合中,则remove会报错。
(2)set与set之间的操作:并集、交集、差集等
set是集合的数据结构,集合也是数学中的重要概念,并集、交集、差集等是集合的基本运算。

1.并集union

union()返回两个集合的并集。
s1 = {1, 2, 3, 4, 5, 6, 7}s2 = {6, 7, 8, 9, 10, 11, 12}print(s1.union(s2))print(s2.union(s1))print(s1 | s2)
输出结果:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

可以看出:A.union(B)==B.union(A)==A|B==B|A

2.交集intersection

s1 = {1, 2, 3, 4, 5, 6, 7}s2 = {6, 7, 8, 9, 10, 11, 12}print(s1.intersection(s2))print(s2.intersection(s1))print(s1 & s2)
输出结果:
{6, 7}
{6, 7}
{6, 7}

可以看出:A.intersection(B)==B.intersection(A)==A&B==B&A

3.差集difference

s1 = {1, 2, 3, 4, 5, 6, 7}s2 = {6, 7, 8, 9, 10, 11, 12}print(s1.difference(s2))print(s2.difference(s1))print(s1 - s2)print(s2 - s1)
输出结果:
{1, 2, 3, 4, 5}
{8, 9, 10, 11, 12}
{1, 2, 3, 4, 5}
{8, 9, 10, 11, 12}

可以看出:1)A.difference(B) 不等于 B.difference(A),从上图中也可以看出来;2)difference可以使用“-”减号代替。

4.对称差集symmetric_difference

在集合A或集合B中,但又不同时在集合A和集合B中。
s1 = {1, 2, 3, 4, 5, 6, 7}s2 = {6, 7, 8, 9, 10, 11, 12}print(s1.symmetric_difference(s2))print(s2.symmetric_difference(s1))print(s1 ^ s2)print(s2 ^ s1)
输出结果:
{1, 2, 3, 4, 5, 8, 9, 10, 11, 12}
{1, 2, 3, 4, 5, 8, 9, 10, 11, 12}
{1, 2, 3, 4, 5, 8, 9, 10, 11, 12}
{1, 2, 3, 4, 5, 8, 9, 10, 11, 12}
5.子集issubset,超集issuperset
判断一个集合是否是另一个集合的子集或超集,可以使用符号‘<=’,‘>’。
s1 = {1, 2, 3, 4, 5, 6, 7}s2 = {6, 7, 8, 9, 10, 11, 12}s3 = {1, 2, 3}s4 = {1, 2, 3}print(s1.issubset(s2))print(s3.issubset(s1))print(s1.issuperset(s3))print(s4 <= s3)print(s1 > s3)
输出结果:
False
True
True
True
True

(3)set的一些重要特点
除了可以进行并、交、差等集合运算外,set还有一些其他特点。

1.初始化时的元素必须是hashable的类型

s = {1, 2, [3, 4, 5]}
TypeError: unhashable type: 'list'
初始化时,其中有一个列表[3,4,5],列表是unhashable type,因此报错。
s = {1, 2, (3, 4, 5), 'abc'}print(s)
{'abc', (3, 4, 5), 2, 1}

元组、字符串等hashable类型是可以的。

2.不支持索引index和切片slice操作

set是一个无序的数据结构,没有位置的概念,因此不支持通常的序列索引和切片操作。所有意图进行indexing和slice的操作都将报错。

3.可以用于去除重复元素

s = {1, 1, 1, 2, 3, 4, 5, 2, 2, 3, 3, 4, 5, 5}s = list(set(s))print(s)
输出结果:
[1, 2, 3, 4, 5]

4.set的in或not in查询操作非常快

set使用hash技术进行元素的存储,因此其查询操作时间复杂度是O(1)的,远远高于列表的O(N)复杂度。
import timest = time.clock()N = 50000arr = [i for i in range(N)]A = [i for i in range(N) if i % 2 == 0]B = [i for i in range(N) if i % 2 == 1]count = 0for x in arr:if x in A:        count += 1elif x in B:        count -= 1print(count)print(time.clock() - st)
输出结果:
0
23.8880947819304

耗时近24秒。如果把A、B转换成set,进行同样的运算:

import timest = time.clock()N = 50000arr = [i for i in range(N)]A = set([i for i in range(N) if i % 2 == 0])B = set([i for i in range(N) if i % 2 == 1])count = 0for x in arr:if x in A:        count += 1elif x in B:        count -= 1print(count)print(time.clock() - st)
输出结果:
0
0.03624072844963256

耗时0.03624秒,list是set耗时的660倍。因此,当需要对一个无重复元素数据集频繁进行查询操作时,使用set是一个很好的选择。

Python的集合set相关推荐

  1. python 获取集合里面的某一个元素

    python 获取集合里面的某一个元素,想想呢集合是不支持所以,切片,相加,相乘操作的, 所以想获取集合里面的某一个元素需要转化下思路,比如把即可转成列表然后在利用索引获取 例如: list_a = ...

  2. Python 3 集合基础和概念!

    Python 3 集合基础和概念! Python 3中,集合是无序的,所以不能进行切片和索引操作. 创建集合有两个方法:set()方法创建的集合是可变的,可被迭代的:frozenset()方法创建的集 ...

  3. python set集合内部实现_Python 实现集合Set的示例

    Python的集合set原理 集合(set)是一个无序的不重复元素序列. 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } ...

  4. python文件下载器代码_GitHub - applechi/pythonCollection: python代码集合(文件下载器、pdf合并、极客时间专栏下载、掘金小册下载、新浪微博爬虫等)...

    json2mysql 这次更新了将一个json文件中的数据导入到mysql的脚本. 是用nodejs写的. 对应的文件是tomysql.js 有兴趣的同志可以研究下. pythonCollection ...

  5. python renamer模块_【免费工具集】4种免费Maya Python脚本集合:重命名、检查UV、分配重叠模型、选边,尽在EL Tool Pack...

    原标题:[免费工具集]4种免费Maya Python脚本集合:重命名.检查UV.分配重叠模型.选边,尽在EL Tool Pack DENG工作室Senior build TD的Erik Lehmann ...

  6. Python frozenset 集合 - Python零基础入门教程

    目录 一.Python frozenset 集合语法 二.Python frozenset 集合使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> P ...

  7. Python set集合 - Python零基础入门教程

    目录 一.set 集合简介 二.set 集合常用函数 三.set 集合运算符 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 ...

  8. python中集合运算_入门 | 一文带你了解Python集合与基本的集合运算

    原标题:入门 | 一文带你了解Python集合与基本的集合运算 选自DataCamp 作者:Michael Galarnyk 参与:Geek Ai.思源 一般我们熟悉 Python 中列表.元组及字典 ...

  9. python空集合_python空集合

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! - 不可变数据类型实现某个功能,需要将结果赋值给另外一个变量; 是否实现for循 ...

  10. python教程400集笔记,Python学习中的笔记--集合相关,python笔记--集合

    Python学习中的笔记--集合相关,python笔记--集合 集合的基本操作 一.可修改的集合set 创建集合 var = set() var = {'a','b','c','d'} 成员检测 va ...

最新文章

  1. @ImportResource-SpringBoot使用xml配置Bean
  2. LeanCloud学习笔记(1)
  3. Erlang列表操作里面的变量绑定规则
  4. apache arrow mysql_新手搭建PHP环境必备知识:windows下PHP5+APACHE+MYSQ完整配置(个人总结)...
  5. 反射工具类,如斯优雅
  6. python中数组的维度_Python数组维度问题
  7. Django模板语言
  8. .NET Core前后端分离快速开发框架(Core.3.0+AntdVue)
  9. 直播 | “深度学习”到底是什么?这篇文章讲明白了
  10. 微信公号“架构师之路”学习笔记(五)-数据库扩展性架构设计(水平切分,秒级扩容,平滑迁移,在线表结构变更,一个大数据量多属性高并发的数据库设计等)
  11. 用计算机弹让我做你的眼睛,让我做你的眼睛 (改编版)歌词
  12. 毕设-基于SpringBoot宠物医院管理系统
  13. (素材源码)猫猫学IOS(十九)UI之QQ好友列表
  14. 国家公祭日(国家哀悼日)将网站改成悼念灰黑色的方法
  15. 升级鸿蒙手机内数据会删除吗,鸿蒙系统:手机升级不会删除任何文件,包括APP的登录状态都不会掉...
  16. Spring-初识Spring框架-IOC控制反转(DI依赖注入)
  17. 全栈设计师必须拥有的Mac软件推荐
  18. 计算机窗口的大小是什么单位,电脑软件窗口大小调整
  19. rails parameter permit
  20. 定时任务组件Quartz

热门文章

  1. get post请求区别_LoadRunner发送GET和POST请求
  2. 移动**21*设置无法接通_电话打得出去,但别人打你的电话提示用户无法接通,是怎么回事?...
  3. Nginx高效学习手册(建议收藏)
  4. 总结2020,起航2021,奔向腾讯,实现增长!
  5. 记一次使用 Lombok 翻车造成的事故!
  6. (Mybaitis)分页
  7. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
  8. JS根据日期比较显示时分或者月日
  9. Java-Web JSP指令、javabean和EL表达式
  10. python类的动态方法是什么_如何在python中为类动态创建类方法