python散装笔记——8: Set(集合)
bigegpt 2024-12-31 09:32 3 浏览
Section 8.1: 集合的操作
与其他sets
# 交集
{1, 2, 3, 4, 5}.intersection({3, 4, 5, 6}) # {3, 4, 5}
{1, 2, 3, 4, 5} & {3, 4, 5, 6} # {3, 4, 5}
# 并集
{1, 2, 3, 4, 5}.union({3, 4, 5, 6}) # {1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5} | {3, 4, 5, 6} # {1, 2, 3, 4, 5, 6}
# 差异
{1, 2, 3, 4}.difference({2, 3, 5}) # {1, 4}
{1, 2, 3, 4} - {2, 3, 5} # {1, 4}
# 对称差分
{1, 2, 3, 4}.symmetric_difference({2, 3, 5}) # {1, 4, 5}
{1, 2, 3, 4} ^ {2, 3, 5} # {1, 4, 5}
# 父集检查
{1, 2}.issuperset({1, 2, 3}) # False
{1, 2} >= {1, 2, 3} # False
# 子集检查
{1, 2}.issubset({1, 2, 3}) # True
{1, 2} <= {1, 2, 3} # True
# 不相接检查
{1, 2}.isdisjoint({3, 4}) # True
{1, 2}.isdisjoint({1, 4}) # False
与单个元素
# 检查是否存在
2 in {1,2,3} # True
4 in {1,2,3} # False
4 not in {1,2,3} # True
# 添加和删除
s = {1,2,3}
s.add(4) # s == {1,2,3,4}
s.discard(3) # s == {1,2,4}
s.discard(5) # s == {1,2,4}
s.remove(2) # s == {1,4}
s.remove(2) # KeyError!
集合操作会返回新的集合,但有相应的对应的操作符:
方法 | 对应的操作符 | 对应的方法 |
union | s |= t | update |
intersection | s &= t | intersection_update |
difference | s -= t | difference_update |
symmetric_difference | s ^= t | symmetric_difference_update |
例如:
s = {1, 2}
s.update({3, 4}) # s == {1, 2, 3, 4}
Section 8.2: 获取列表中的唯一元素
比方说,你有一个餐馆列表,也许是从一个文件中读取的。你关心的是列表中唯一的餐馆。从list 中获取唯一元素的最佳方法是将其转化为set:
restaurants = ["McDonald's", "Burger King", "McDonald's", "Chicken Chicken"]
unique_restaurants = set(restaurants)
print(unique_restaurants)
# prints {'Chicken Chicken', "McDonald's", 'Burger King'}
请注意,set 的顺序与原始 list 的顺序不同;这是因为 set 是无序的,就像 dict 一样。
使用 Python 内置的 list 函数,可以很容易地将其转换回 List,从而得到与原始 list 相同但没有重复的另一个 list:
list(unique_restaurants)
# ['Chicken Chicken', "McDonald's", 'Burger King']
这样写在一行也很常见:
# Removes all duplicates and returns another list
list(set(restaurants))
现在,可以再次对原始列表执行任何操作。
Section 8.3: Set of Sets
像下面这样定义一个set
{{1,2}, {3,4}}
会出现下面的类型错误:
TypeError: unhashable type: 'set'
请使用 frozenset,则不会报错:
{frozenset({1, 2}), frozenset({3, 4})}
Section 8.4: 使用方法和内置程序进行set操作
我们定义两个 sets a 和 b
>>> a = {1, 2, 2, 3, 4}
>>> b = {3, 3, 4, 4, 5}
注意:{1} 创建的集合只有一个元素,而 {} 创建的是空 dict。创建空集的正确方法是 set()。
交集
a.intersection(b) 返回一个新集合,其元素同时出现在 a 和 b 中
>>> a.intersection(b)
{3, 4}
联合
a.union(b) 返回一个新集合,其中包含 a 和 b 中的元素
>>> a.union(b)
{1, 2, 3, 4, 5}
差集
a.difference(b) 返回一个新集合,其元素存在于 a 中,但不在 b 中
>>> a.difference(b)
{1, 2}
>>> b.difference(a)
{5}
对称差集
a.symmetric_difference(b) 返回一个新集合,其元素存在于 a 或 b 中,但不同时存在于两个集合中。
>>> a.symmetric_difference(b)
{1, 2, 5}
>>> b.symmetric_difference(a)
{1, 2, 5}
注: a.symmetric_difference(b) == b.symmetric_difference(a)
子集和超集
c.issubset(a) 测试 c 的每个元素是否都在 a 中。
a.issuperset(c) 测试 c 的每个元素是否都在 a 中。
>>> c = {1, 2}
>>> c.issubset(a)
True
>>> a.issuperset(c)
True
后一种操作有如下所示的等效运算符:
Method | Operator |
a.intersection(b) | a & b |
a.union(b) | a|b |
a.difference(b) | a - b |
a.symmetric_difference(b) | a ^ b |
a.issubset(b) | a <= b |
a.issuperset(b) | a >= b |
互不相交的集合
如果 a 中没有元素也在 d 中,则集合 a 和 d 不相交,反之亦然。
>>> d = {5, 6}
>>> a.isdisjoint(b) # {2、3、4}都在这两个集合中
False
>>> a.isdisjoint(d)
True
# 这是一种等效的检查,但效率较低
>>> len(a & d) == 0
True
# 这样的效率更低
>>> a & d == set()
True
测试成员
内置关键字可搜索出现次数
>>> 1 in a
True
>>> 6 in a
False
长度
内置 len() 函数返回集合中元素的个数
>>> len(a)
4
>>> len(b)
3
Section 8.5: 集合和多集合
sets 是由不同元素组成的无序集合。但有时我们需要处理不一定是不同元素的无序集合,并跟踪元素的乘数。
请看这个例子:
>>> setA = {'a','b','b','c'}
>>> setA
set(['a', 'c', 'b'])
将字符串 a、b、b、c 保存到 set 数据结构中,我们就丢失了 b 出现两次的信息。当然,将元素保存到 list 中可以保留这些信息
>>> listA = ['a','b','b','c']
>>> listA
['a', 'b', 'b', 'c']
但 list 数据结构会引入额外的不需要的排序,从而减慢我们的计算速度。
为了实现多集合,Python 提供了集合模块中的 Counter 类(从 2.7 版开始): Python 2.x 版本 ≥ 2.7
>>> from collections import Counter
>>> counterA = Counter(['a','b','b','c'])
>>> counterA
Counter({'b': 2, 'a': 1, 'c': 1})
counter 是一个字典,其中元素作为字典键存储,其计数作为字典值存储。和所有字典一样,它是一个无序集合。
- 上一篇:python中的集合函数——set
- 下一篇:Python数据类型——集合
相关推荐
- 为3D手游打造, Visual Studio Unity扩展下载
-
IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
-
1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...
- 微软首次回答 HoloLens 相关问题,终于爆料了
-
fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...
- C#指针的应用(c#指针类型)
-
C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...
- C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)
-
C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...
- 欢迎回来:Fortran意外重回流行编程语言20强榜单
-
TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...
- C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案
-
简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...
- C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤
-
在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...
- C# (一)状态机模式(状态机代码实现)
-
最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...
- C# 中 Predicate 详解(c#中的replace)
-
Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...
- C#中$的用法?(c#中&&什么意思)
-
文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...
- C#并行编程:Parallel类(c# 并行处理)
-
在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...
- 颠覆认知!用Span重构foreach循环竟让数据处理快如闪电
-
在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...
- Unity3D手游开发实践《腾讯桌球》客户端开发经验总结
-
本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...
- .NET 7 AOT 的使用以及 .NET 与 Go 互相调用
-
目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)