Python中的集合(set and frozenset)语法汇总

news2025/4/27 10:34:48

集合的基本语法知识

目前有两种集合类型:setfrozenset

可变集合:set()

set类型是可变的, 其内容可以使用 add() 和 remove() 这样的方法来改变,因为是可变的,所以没有哈希值,且不能被用作字典的键或其它集合的元素。 set构建除了使用set构造器,非空的set还可以通过将以逗号分隔的元素列表包含于花括号之内来创建。

set的构造器方法:

  • set(iterable) :返回一个新的set对象,其元素来自于iterable。如果未指定 iterable,则将返回一个新的空集合。

可变集合类型的方法如下:

  • s.update(t):用t中的元素修改s,即,s现在包含s或t的成员。

  • s.intersection_update(t):s中的成员是共同属于s和t的元素。

  • s.difference_update(t):s中的成员是属于s但不包含在t中的元素。

  • s.symmetric_difference_update(t):s中的成员更新为那些包含在s或t中,但不是s和t共有的元素。

  • s.add(obj):在集合s中添加对象obj。

  • s.remove(obj):从集合s中删除对象obj;如果obj不是集合s中的元素,将引发KeyError错误。

  • s.discard(obj):如果obj是集合s``中的元素,从集合s中删除对象obj。

  • s.pop():删除集合s中的任意一个对象,并返回它。

  • s.clear():删除集合s中的所有元素。

注意事项:

  1. 集合是一个无序的不重复的元素序列,能够去重复,删除重复项。

  1. 空集合必须使用set(),因为{}是用来创建空字典。

  1. set中的数据一定要是不可变数据,否则报错。如下:

>>> set([1, 2, [1, 34]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

冻结集合:frozenset()

frozenset()方法返回一个不可变的frozenset对象,该对象使用给定iterable中的元素进行初始化。冻结集合(Frozen set)只是Python集合对象的不可变版本。 一个集合的元素可以随时修改,但是冻结集合的元素在创建后保持不变。因此,冻结集合可以用作Dictionary中的键或用作另一个集合的元素。 但是像集合一样,它也不是有序的。

frozenset()方法的语法为:

frozenset([iterable])
  • iterable(可选)- 可迭代对象,它包含用于初始化frozenset的元素。可迭代对象可以是集合、字典、元组等。

  • frozenset()方法返回一个不可变的frozenset,它使用给定iterable中的元素进行初始化。如果未传递任何参数,则返回一个空的frozenset

例子1:传入一个元组。

>>> vowels = ('a', 'e', 'i', 'o', 'u')
>>> fSet = frozenset(vowels)
>>> fSet
frozenset({'o', 'u', 'i', 'e', 'a'})
>>> frozenset()
frozenset()

例子2:当将字典用作冻结集合的可迭代对象时, 只使用字典的键来创建集合。

>>> person = {"name": "John", "age": 23, "sex": "male"}
>>> fSet = frozenset(person)
>>> fSet
frozenset({'sex', 'age', 'name'})

例子3:如果想更改frozenset对象,则会引发错误

>>> favourite_subject = ["OS", "Data Base", "Algorithm"]
>>> f_subject = frozenset(favourite_subject)
>>> f_subject[1] = "Networking"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'frozenset' object does not support item assignmen

例子4:验证setfrozenset的区别(add()函数)

>>> f_set = frozenset("hiekay") 
>>> f_set
frozenset(['h', 'i', 'e', 'k', 'a','y'])
>>> f_set.add("python")  # 报错,没有add方法
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'

######################################################################################

>>> a_set = set("github")  # 可以原处修改的set
>>> a_set
set(['b', 'g', 'i', 'h', 'u', 't'])
>>> a_set.add("python")
>>> a_set
set(['b', 'g', 'i', 'h', 'python', 'u', 't'])

set与frozenset的区别

set(可变集合)与frozenset(不可变集合)的区别:

  • set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素。集合对象还支持union(联合),intersection(交集),difference(差集)和sysmmetric_difference(对称差集)等数学运算。作为一个无序的集合,set不记录元素位置或者插入点。因此,set不支持indexing,或其它类序列的操作。

  • frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。

基本的集合运算

元素与集合的关系

属于

元素是否属于某个集合。

>>> aset
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> "a" in aset
False
>>> "h" in aset
True

集合与集合的关系

集合相等

A是否等于B,即两个集合的元素完全一样。

>>> a = set("abcde")
>>> b = set("abfgh")
>>> a
set(['a', 'b', 'c', 'd', 'e'])
>>> b
set(['a', 'b', 'f', 'g', 'h'])
>>> a == b
False
>>> a != b
True

子集 / 超集

A是否是B的子集,或者反过来,B是否是A的超集。即A的元素也都是B的元素,但是B的元素比A的元素数量多。

>>> c = set("ab")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> c
set(['a', 'b'])
>>> c < a     # c是a的子集
True
>>> c.issubset(a)   # 或者用这种方法,判断c是否是a的子集
True
>>> a.issuperset(c) # 判断a是否是c的超集
True
 
>>> b
set(['a', 'h', 'b', 'g', 'f'])
>>> a < b     # a不是b的子集
False
>>> a.issubset(b)   # 或者这样做
False

并集

A、B的并集,即A、B所有元素

>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> b
set(['a', 'h', 'b', 'g', 'f'])
>>> a | b    # 可以有两种方式,结果一样
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'h'])
>>> a.union(b)
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'h'])

交集

A、B的交集,即A、B所公有的元素

>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> b
set(['a', 'h', 'b', 'g', 'f'])
>>> a & b   # 两种方式,等价
set(['a', 'b'])
>>> a and b
set(['a', 'h', 'b', 'g', 'f'])
>>> a.intersection(b)
set(['a', 'b'])

差 / 补

A相对B的差(补),即A相对B不同的部分元素。差符号有一个等价的方法:difference()

>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> b
set(['a', 'h', 'b', 'g', 'f'])
>>> a - b
set(['c', 'e', 'd'])
>>> a.difference(b)
set(['c', 'e', 'd'])

对称差

对称差分是集合的XOR(又称“异或”)。两个集合(A和B)的对称差分是指另外一个集合C,该集合中的元素,只能是属于集合A或者集合B的成员,不能同时属于两个集合。

对称差分有一个等价的方法:symmetric_difference()

>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> b
set(['a', 'h', 'b', 'g', 'f'])
>>> a.symmetric_difference(b)
set(['c', 'e', 'd', 'g', 'f', 'h'])

混合集合类型操作

左边是可变集合,右边是不可变集合,运算符所产生的仍然是可变集合。但是如果左右操作数的顺序反过来,结果相反:

>>> fSet = frozenset(('a', 'e', 'i', 'o', 'u'))
>>> Set = {'a', 'c'}

>>> fSet | Set
frozenset({'c', 'o', 'u', 'i', 'e', 'a'})

>>> Set | fSet
{'c', 'o', 'u', 'i', 'e', 'a'}

如果左右两个操作数的类型相同, 即都是可变集合或不可变集合,则所产生的结果类型是相同的,但如果左右两个操作数的类型不相同(左操作数是set,右操作数是frozenset,或相反情况),则所产生的结果类型与左操作数的类型相同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java线上项目排查,Arthas简单上手

Arthas 是Alibaba开源的Java诊断工具。参考&#xff1a;Arthas 用户文档 — Arthas 3.5.4 文档 当你遇到以下类似问题而束手无策时&#xff0c;Arthas可以帮助你解决&#xff1a; 这个类从哪个 jar 包加载的&#xff1f;为什么会报各种类相关的 Exception&#xff1f;我改的代…

一起Talk Android吧(第四百七十九回:集合类视图动画)

文章目录使用方法属性介绍示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"旋转类视图动画",这一回中咱们说的例子是"集合类视图动画"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; 使用方法 集合类动画…

web测试2:嵌入式移植boa

读此篇之前&#xff0c;先读前一篇 1.在源码编译的时候&#xff0c;指定交叉编译工具链 lkmaoubuntu:~$ arm-linux-gnueabi-gcc --version arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc.…

C++工程的CMakeLists.txt文件编写

最简单的demo工程如下&#xff1a; #include <iostream> #include <string> int main(int argc,char** argv) {std::cout << "hello world" << std::endl;return 0; } 文件结构如下&#xff0c;其中include可用来自定义接口功能类。 CMake…

IMX Linux 用户手册 --- 1

IMX Linux 用户手册 — 1 第一章 概述 本文档介绍了i.MX LinuxOS BSP (BSP代表Board Support Package)在i.MX平台上的构建和安装方法。它还涵盖了特殊的i.MX功能和如何使用它们。 本文档还提供了运行i.MX平台的步骤&#xff0c;包括单板拨码开关设置、U-Boot引导加载程序的配置…

IP地址是什么

我们知道&#xff0c;网络通讯的本质就是收发数据包。如果说收发数据包就跟收发快递一样。那IP地址就类似于快递上填的收件地址和发件地址一样&#xff0c;有了它&#xff0c;路由器就可以开始充当快递员的角色&#xff0c;在这个纷繁复杂的网络世界里找到该由谁来接收这个数据…

linux上git三板斧的使用

前言 现在在我们的生活当中&#xff0c;用我们程序员的一句玩笑话&#xff0c;来说就是“全球最大的同性交友网站就是githup”。 那么它具有什们功能呢&#xff0c;能让人这么吹捧&#xff0c;用通俗易懂的话来说就是&#xff0c;储存和管理代码&#xff0c;它会记录我们修改甚…

java知识总结(一)

ArrayList和LinkedList的区别1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。2. 对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个…

【开发工具 - 安装手册】BeyondCompare4 下载与安装+免费使用

1. 官网 Download Beyond Compare Free Trial 2. 下载 阿里云盘 &#xff08;不限速 - 推荐&#xff09;官网下载3. 安装&#xff08;无脑下一步&#xff09; 4.三种方法长期免费使用 方法一 修改初始化文件 C:\Users\Administrator\AppData\Roaming\BCompare\BCompare.ini…

【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++

第十一章 队列 目录 第十一章 队列 ●前言 ●一、队列是什么&#xff1f; 1.简要介绍 2.具体情况 ●二、队列操作的关键代码段 1.类型定义 2.顺序队列的常用操作 3.链式队列的常用操作 ●总结 前言 简单来说&#xff0c;数据结构是一种辅助程序设计并且进行优化的方法论&…

介绍一款2023年新出的mysql管理工具: FlyBird Database Manager

FlyBird Database Manager 介绍 FlyBird Database Manager 是一款mysql 界面化管理工具&#xff0c; 使用go语言编写&#xff0c;天然支持Windows, MacOS, Linux等主流平台。 提供无需安装的命令行版本&#xff0c; 命令行中启动服务&#xff0c;以html支持UI界面,在浏览器中…

[Linux]进程控制

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

1607_PC汇编语言_汇编语言简介

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 刚刚看了一个小章节&#xff0c;感觉是对8086的汇编做了一个简单的介绍。当然&#xff0c;这里面也有各种机器汇编通用的属性。 1. 等价符号关联的两个表达其实是等…

在线教育-谷粒学院学习笔记(十)

文章目录1 介绍2 登录业务流程3 JWT令牌4 阿里云短信服务5 登录功能6 注册功能7 根据token获取用户信息8 整合首页登录和注册1 介绍 登录实现流程 注册接口 整合JWT整合阿里云短信服务 登录接口 注册、登录的前端实现 2 登录业务流程 单一服务器模式 使用session对象实现 …

仿牛客论坛项目(下)

代码仓库:https://gitee.com/qiuyusy/community 仿牛客论坛项目15.kafka1.阻塞队列2.Kafka入门简介术语解释下载配置命令3.Spring整合Kafka引入依赖配置代码16.系统通知(Kafka)发送系统通知功能(点赞关注评论)1.编写Kafka消息队列事件Event实体类2.编写Kafka生产者3.编写Kafka消…

Spring 源码编绎

本示例基于 spring-framework-5.2.22.RELEASE GradleWapper jdk1.8.0_131编译# 环境准备mavenjdk8idea# 源码下载进入https://github.com/spring-projects/spring-frameworkSpring的源码是发布在github上面的下载最新版发布版源码不要太纠结版本区别&#xff0c;无需刻意保证…

BM5 合并k个已排序的链表

目录 描述 示例1 示例2 思路&#xff1a; 代码&#xff1a; 描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 示例1 输入&#xff1a;[{1,2,3},{4,5,6,7}] 返回值&#xff1a;{1,2,3,4,5,6,7} 示例2 输入&#xff1a;[{1,2},{1,4,5},{6}] 返回值…

Linux常用命令——rmmod命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rmmod 从运行的内核中移除指定的内核模块 补充说明 rmmod命令用于从当前运行的内核中移除指定的内核模块。执行rmmod指令&#xff0c;可删除不需要的模块。Linux操作系统的核心具有模块化的特性&#xff0c;应…

Elasticsearch(六)--ES文档的操作(中)---修改文档

一、前言 上篇文章我们了解了ES的插入和批量插入文档的操作&#xff0c;分别通过ES的kibana客户端以及Java高级Rest客户端进行学习&#xff0c;那么本篇则进入到对文档的修改操作&#xff0c;同新增文档&#xff0c;也有更新单条文档和批量更新文档操作&#xff0c;但还多出一…

Day873.普通索引唯一索引的选择 -MySQL实战

普通索引&唯一索引的选择 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于普通索引&唯一索引的选择的内容。 假设你在维护一个市民系统&#xff0c;每个人都有一个唯一的身份证号&#xff0c;而且业务代码已经保证了不会写入两个重复的身份证号。 如果市民…