百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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 ab

>>> a = {1, 2, 2, 3, 4}
>>> b = {3, 3, 4, 4, 5}

注意:{1} 创建的集合只有一个元素,而 {} 创建的是空 dict。创建空集的正确方法是 set()

交集

a.intersection(b) 返回一个新集合,其元素同时出现在 ab

>>> a.intersection(b)
{3, 4}

联合

a.union(b) 返回一个新集合,其中包含 ab 中的元素

>>> 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) 返回一个新集合,其元素存在于 ab 中,但不同时存在于两个集合中。

>>> 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 中,则集合 ad 不相交,反之亦然。

>>> 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'])

将字符串 abbc 保存到 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 是一个字典,其中元素作为字典键存储,其计数作为字典值存储。和所有字典一样,它是一个无序集合。

相关推荐

为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#...