Python程序设计——元组、集合和字典
可以使用元组存储一个固定的元素列表,使用集合存储和快速访问不重复的元素、使用字典存储键值对并使用这些关键字来快速访问元素。
一、元组
元组跟列表类似,但是元组中的元素是固定的;也就是说,一旦一个元组被创建,就无法对元组中的元素进行添加、删除、替换或重新排序。
如果在应用中不应该对列表中的内容进行修改,那么就可以使用元组来防止元素被意外添加、删除或替换。除了元组的元素是固定的以外,元组与列表很像。进一步讲,由于Python的实现,元组比列表的效率更高。
可以通过将元素用一对括号括起来来创建一个元组。这些元素用逗号分隔。可以创建一个空元组或从一个列表创建一个元组, 如下面的例子所示。
t1 = () # Create an empty tuple
t2 = (1,3,5) # Create a tuple with three el ements
# Create a tuple from a list
t3 = tup1e([2 * x for x in range(1, 5)])
也可以从一个字符串创建一个元组。字符串中的每个字就变成了元组的一个元素。例如:
# Create a tuple from a string
t4 = tuple("abac") # t4 is ['a'. 'b', 'a'. 'c']
元组是序列。在表10-1中针对序列的常见操作也可以用在元组上。可以在元组上使用len、min、max和sum函数。可以使用一个for循环遍历一个元组的所有元素,并使用一个下标运算符来访问元组中对应的元素或元素段。可以使用in和not in运算符来判断一个元素是否在元组中,并使用比较运算符来对元组中的元素进行比较。
“元组的元素是固定的”是指不能给一个元组添加、删除和替换元素以及打乱元组中的元素。
注意:一个元组包含了一个固定的元素列表。一个元组里的一个个体元素可能是易变的。例如,下面的代码创建了一个圆的元组(第2行),并改变第一个圆的半径为30(第3行)。
>>> from CircleFromGeometricObject import Circle
>>> circles = (Circle(2), Circle(4), Circle(7))
>>> circles[0].setRadius(30)
>>> circles[0].getRadius()
>>> 30
>>>
在这个例子中,元组中每一个元素都是一个圆对象。尽管不能添加、删除或替换元组中的圆对象,但是可以改变一个圆的半径,因为一个圆对象是可变的。如果一个元组包含不可变的对象,那么这个元组被称为不可变的。例如,一个数字元组或一个字符串元组是不可变的。
二、集合
关键点:集合与列表类似,可以使用它们存储一个元素集合。但是,不同于列表,集合中的元素是不重复且不是按任何特定顺序放置的。
如果你的应用程序不关心元素的顺序,使用一个集合来存储元素比使用列表效率更高。
2.1、创建集合
可以通过将元素用一对花括号( { })括起来以创建一个元素集合。集合中的元素用逗号分隔。可以创建一个空集,或者从一个列表或一个元组创建一个集合,如下面的例子所示。
s1 = set() # Create an empty set
s2 = {1, 3, 5} # Create a set with three e lements
s3 = set((1, 3, 5)) # Create a set from a tuple
# Create a set from a list
s4 = set([x * 2 for x in range(1, 10)])
同样的,可以通过使用语法list(set)或tuple(set)从集合创建一个列表或一个元组。
也可以从一个字符串创建一个集合。 字符串中的每个字符就成为集合中的一个元素。
例如:
# Create a set from a string
s5 = set("abac") # s5 is {'a','b','c'}
注意:尽管字符a在字符串中出现了两次,但在集合中只出现了一次,因为一个集合中不存储重复的元素。
一个集合可以包含类型相同或不同的元素。例如: s= {1,2,3,"one" ,"two" ,"three"}是一个包含数字和字符串的集合。集合中的每个元素必须是哈希的( hashable)。Python 中的每一个对象都有一个哈希值,而且如果在对象的生命周期里对象的哈希值从未改变,那么这个对象是哈希的。目前所介绍的所有类型对象除了列表之外都是哈希的。
2.2、操作和访问集合
可以通过使用add(e)或remove(e)方法来对一个集合添加或删除元素。可以使用函数len、min、 max和sum对集合操作,可以使用for循环遍历一个集合中的所有元素。
可以使用in或not in运算符来判断一个元素是否在一个集合当中
注意:如果删除一个集合中不存在的元素,remove(e) 方法将抛出一个KeyError异常。
2.3、 子集和超集
如果集合s1中的每个元素都在集合s2中,则称s1是s2的子集。可以使用s1.issubset(s2)方法来判断s1是否是s2的子集,如下面代码所示。
>>> s1={1,2,4}
>>> s2={1,4,5,2,6}
>>> s1.issubset(s2) # s1 is a subset of s2
True
>>>
如果一个集合s2中的元素同样都在集合s1中,则称集合s1是集合s2的超集。可以使用s1.issuperset(s2)方法来判断s1是否是s2的超集,如下面代码所示。
>>> s1={1,2,4}
>>> s2={1,4,5,2,6}
>>> s2.issuperset(s1) # s2 is a superset of s1
True
>>>
2.4、相等性测试
可以使用运算符==和!=来检测两个集合是否包含相同的元素。例如:
>>> s1={1,2,4}
>>> s2={1,4,2}
>>> s1==s2
True
>>> s1 != s2
False
>>>
在这个例子中,尽管s1和s2的元素顺序不同,但是这两个集合包含相同的元素。
注意:使用传统的比较运算符(>、>=、<=和<)来比较集合毫无意义,因为集合中的元素并没有排序。但是,当这些操作符用在集合上时有着特殊的含义:
- 如果s1是s2的一个真子集,则s1<s2返回True。
- 如果s1是s2的一个子集,则s1<=s2返回True。
- 如果s1是s2的一个真超集,则s1>s2返回True。
- 如果s1是s2的一个超集,则s1>=s2返回True。
注意:如果s1是s2的一个真子集,那么s1的每个元素同样也都在s2中,但是s2中至少存在一个不在s1中的元素。如果s1是s2的一个真子集,那么s2是s1的一个真超集。
2.5、集合运算
Python提供了求并集、交集、差集和对称差集合的运算方法。
两个集合的并集是一个包含这两个集合所有元素的集合。可以使用union方法或者 | 运算符来实现这个操作。例如:
>>> s1={1,2,4}
>>> s2={1,3,5}
>>> s1.union(s2)
{1,2,3,4,5}
>>>
>>> s1 | s2
{1,2,3,4,5}
>>>
两个集合的交集是-一个包含了两个集合共同的元素的集合。可以使用intersection方法或者&运算符来实现这个操作。例如:
>>> s1={1, 2, 4}
>>> s2={1, 3, 5}
>>> s1.intersection(s2)
{1}
>>>
>>> s1 & s2
{1}
>>>
set1和set2之间的差集是一个包含了出现在set1但不出现在set2的元素的集合。可以使用difference方法或 - 运算符来实现这个操作。例如:
>>> s1={1,2,4}
>>> s2={1,3,5}
>>> sl.difference(s2)
{2,4}
>>>
>>> s1 - s2
{2,4}
>>
两个集合之间的对称差(或者称为异或)集合是一个包含了除它们共同元素之外所有在这两个集合之中的元素。可以使用symmertric_difference 方法或 ^ 运算符来实现这个操作。
例如:
>>> s1={1, 2, 4}
>>> s2={1, 3, 5}
>>> s1.symmetric_difference(s2)
{2,3,4,5}
>>>
>>> s1 ^ s2
{2,3,4,5}
>>>
注意:这些set方法都返回一个结果集合,但是它们并不会改变这些集合中的元素。
三、比较集合和列表的性能
关键点:对于in和not in运算符和remove方法,集合比列表的效率更高。
列表中的元素可以使用下标运算符来访问。但是,集合并不支持下标运算符,因为集合中的元素是无序的。使用for循环遍历集合中的所有元素。
四、字典
关键点:一个字典是一个存储键值对集合的容器对象。它通过使用关键字实现快速获取、删除和更新值。
假设程序需要存储“No-Fly” 表中有关恐怖分子的详细信息。字典就是这个任务的一种有效的数据结构。一个字典是按照关键字存储值的集合。这些关键字很像下标运算符。在一个列表中,下标是整数。在一个字典中,关键字必须是一个可哈希对象。一个字典不能包含有重复的关键字。每个关键字都对应着一个值。一个关键字和它对应的值形成存储在字典中的一个条目(输入域),如图所示。
这种数据结构被称为“字典",因为它与词典很类似,在这里,单词就相当于关键字而这些单词的详细定义就是相应的值。一个字典也被认为是一张图,它将每个关键字和一个值相匹配。
4.1、 创建一个字典
可以通过一对花括号({ })将这些条目括起来以创建一个字典。每一个条目都由一个关键字,然后跟着一个冒号,再跟着一个值组成。每一个条目都用逗号分隔。例如,下面语句:
students = {"111-34-3434":"John", "132-56-6290":"Peter"}
创建一个具有两个条目的字典,如图14-1b所示。字典中的每一个条目的形式都是key:value。第一个条目的关键字是111-34-3434,它对应的值是John。关键字必须是可哈希类型,例如:数字和字符串。而值可以是任意类型。可以使用下面的语法来创建一个空字典。
students = {} # Create an empty dictionary
注意: Python 使用花括号创建集合和字典。 语法{ }被用来表示一个空字典。 为了创建一个空集合,使用set()。
4.2、 添加、修改和获取值
为了添加一个条目到字典中,使用语法:
dictionaryName[key] = value
例如:
students["234-56-9010"] = "Susan"
如果这个关键字已经在字典中存在,前面的语法将替换该关键字对应的值。为了获取一个值,只要使用dictionaryName[key]编写一个表达式即可。如果该关键字在字典中,那么返回这个关键字对应的值。否则,抛出一个KeyError异常。
4.3、删除条目
为了从字典删除一个条目,使用语法:
del dictionaryName[key]
例如:
del students["234-56-9010"]
这条语句从字典中删除关键字为234-56-9010的对应条目。如果字典中不存在该关键字,那么抛出一个KeyError异常。
4.4、循环条目
可以使用一个for循环来遍历字典中所有的关键字。例如:
1 >>> students = {"111-34-3434": "John","132-56-6290":"Peter"}
2 >>> for key in students :
3 ... print(key + ":" + str(students[key]))
4 ...
5 "111- 34- 3434":"John"
6 "132- 56-6290":"Peter"
7 >>>
for循环对字典students中的关键字进行迭代(第2行)。students[key] 返回关键字key对应的值(第3行)。
4.5、 len 函数
可以使用len(dictionary)来获得一个字典中条目的数目。例如:
1 >>> students = {"111-34-3434":"John", "132-56- 6290" :"Peter"}
2 >>> len(students)
3 2
4 >>>
在第2行,len(students)返回字典students中条目的数目。
4.6、检测一个关键字是否在字典中
可以使用in或not in运算符来判断一个关键字是否在一个字典当中。例如:
1 >>> students = {"111-34-3434":"John", "132-56- 6290":"Peter"}
2 >>> "111-34-3434" in s tudents
3 True
4 >>> "999-34-3434" in students
5 False
6 >>>
在第2行,"111-34-3434" in students 将检测关键字111-34-3434 是否在字典students 中。
4.7、相等性检测
可以使用运算符==和!=来检测两个字典是否包含同样的条目。例如:
>>> d1 = {"red":41, "blue":3}
>>> d2 = {"b1ue":3, "red":41}
>>> d1 == d2
True
>>> d1 != d2
False
在这个例子中,不管这些条目在字典中的顺序,d1和d2包含有相同的条目。
注意:不能使用比较运算符(>、>=、<=和<)对字典进行比较,因为字典中的条目是没有顺序的。
4.8、字典方法
Python中的字典类是dict。
get(key)方法除了当关键字key不在字典中时返回None而不是抛出一个异常,其他都与dictionaryName[key]类似。pop(key) 方法与del dictionaryName[key]类似。
五、总结
- 一个元组是一个固定列表。不能对元组中的元素进行添加、删除或替换。
- 由于元组是一个序列,所以序列的常用操作也可以用于元组。
- 尽管不能对元组进行元素的添加、删除或者替换,但是如果该元素是可变的话你可以改变这个单独元素的内容。
- 如果元组的所有元素都是不可变的,那么这个元组是不可变的。
- 集合就像是用来存储元素集的列表。但是,不同于列表,集合中的元素是不可重复的而且是没有以特定顺序放置的。
- 可以使用add方法向一个集合添加元素,使用remove方法从一个集合删除元素。
- 函数len. min、 max和sum都可用在集合上。
- 可以使用一个for循环来遍历集合中的元素。
- 可以使用issubset或issuperset方法来检测一个集合是否是另一个集合的子集或父集,并使用|、&、-和^运算符来实现求集合的并集、交集、差集和对称差集。
- 在判断一个元素是否存在于集合或列表中,以及从集合或列表删除元素时,集合都比列表的效率更高。
- 字典可用于存储键值对。可以使用一个关键字来获取一个值。这些关键字就像是一个下标操作符。
- 在一个列表中,这些下标都是整数。在一个字典中,这些关键字可以是任意的可哈希对象,例如:数字和字符串。
- 可以使用dictionaryName[key]来获取字典中某个给定关键字对应的值,并使用dictionaryName[key]=value来添加或修改字典中的一个条目。
- 可以使用del dictionaryName[key]删除给定关键字对应的条目。
- 可以使用一个for循环来遍历一个字典中的所有关键字。
- 可以使用len函数返回字典的所有条目数。
- 可以使用in和not in运算符来确定一个关键字是否在字典当中,使用==和!=操作符来检测两个字典是否相同。
- 可以对字典使用keys(、values()、 iterms()、 clear()、 get(key)、 pop(key) 和popitem()方法。
相关文章:

Python程序设计——元组、集合和字典
可以使用元组存储一个固定的元素列表,使用集合存储和快速访问不重复的元素、使用字典存储键值对并使用这些关键字来快速访问元素。 一、元组 元组跟列表类似,但是元组中的元素是固定的;也就是说,一旦一个元组被创建,就无法对元组中的元素进行…...

八股文之框架篇(Spring Boot、SSM)
文章目录 Spring中的单例bean是线程安全的吗什么是AOP,项目中有没有使用到AOPSpring中的事务是如何实现的Spring中事务失效的场景有哪些Bean的生命周期Spring中的循环依赖(循环引用)SpringMVC的执行流程SpringBoot自动配置原理Spring、Spring…...

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)
1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场…...
【JS 贪心算法常见步骤】
贪心算法是一种解决优化问题的算法,其思想是在每一步选择中选择当前状态下最优解,从而达到全局最优解的目的。 以下是贪心算法的一些常见步骤: 将问题模型化为一个包含若干子问题的问题集合,每个子问题都有一个最优解。 对于每个…...

应用案例|基于三维机器视觉的机器人纸箱拆码垛应用解决方案
Part.1 项目背景 在现代物流和制造行业中,纸箱的拆码垛操作是一项重要且频繁的任务。传统的纸箱拆码垛工作通常由人工完成,这种方式存在劳动强度大、生产效率低以及人为操作容易导致错误等问题,严重影响物料的安全运输和质量。为了满足物流行…...
【ARM 嵌入式 编译 Makefile 系列 10 - Makefile sort 函数详细介绍】
文章目录 Makefile 函数 sort 学习Makefile 函数 sort 学习 sort 是Makefile的一个内建函数,它用于将列表中的词进行排序,并删除重复的词。sort函数的语法如下: $(sort list)list是你想要排序的单词列表。 下面是一个使用sort函数的简单示例: FOO = c b a c b a BAR =…...
Flask下载文件报错304 NOT MODIFIED
文章目录 问题描述解决方案参考文献 问题描述 前端 Vue 下下来的文件无法正常打开,大小比正常的略大一点,通过 Postman 直接调用是正常的 解决方案 由前端解决 如果响应大小比文件略大一点,从 responses 中取出关键数据再组成文件如果响应…...

AI Chat 设计模式:15. 桥接模式
本文是该系列的第十五篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 如果你是第一次接触桥接模式,那么你会有哪些疑问呢?A.1Q.2 什…...
Python批量替换Excel和Word中的关键字
一、问题的提出 有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉。因为这么多文件,要一个一个地打开文件,再进行批量替换修改,几个文件还好&…...

Codeforces算法心得——A. Array Coloring
大家好,我是晴天学长,确实全世界最大的算法竞赛平台有很多独特且创新的地方,后面我会持续的更新的!加油!💪💪💪 1 )A. Array Coloring 2) .算法思路 数组中的奇数个数一…...

论文阅读:《Waymo Public Road Safety Performance Data》
文章目录 1 背景2 方法2.1 数据来源2.2 碰撞数据 3 碰撞事件分析4 讨论 1 背景 这篇文章是讲waymo道路安全性能数据分析的,主要想表达的是waymo自动驾驶系统在安全上面的出色表现,以向政府、大众提高自己产品的公信力。 这篇文章分析的数据是自从2019年到…...
url中的特殊符号及特殊字符编码对照表
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。 编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的…...
【C++】详解用标准库的std::mt19937生成随机数
2023年8月16日,周三晚上 写了1个半小时 目录 概述英文文档什么是mt19937什么是状态大小头文件std::mt19937的常用成员函数1. 构造函数:2. 种子操作函数:3. 随机数生成函数:4. 辅助函数:生成种子值方法1:使…...

科大讯飞发布星火认知大模型2.0版——体验实测
8月15日,科大讯飞举行讯飞星火认知大模型V2.0升级发布会,对外展示其升级后的大模型代码能力和多模态能力,同时发布并升级搭载讯飞星火认知大模型V2.0能力的多项应用和产品。自5月6日首发以来,星火认知大模型经历V1.5版本的迭代&am…...

部署mysql到win10电脑上
中间出现了很多问题, 记录一下 我这边是去官网下载的 ,链接:https://dev.mysql.com/downloads/mysql/ 我这边选了不是最新版本的MySQL,因为第一次安装8.1.0版本的,死活运行不起来,直接卸载安重装了&#x…...
nginx+php 出现502 bad gateway
nginxphp 出现502 bad gateway,一般这都不是nginx的问题,而是由于 fastcgi或者php的问题导致的,常见的有以下几种。 1. php.ini 的memory_limit 过小(如果有个别php程序进程需要占用极大内存时这个必须注意) 2. ph…...

基于LVQ神经网络的人脸朝向识别
1案例背景 1.1人脸识别概述 人脸识别作为一个复杂的模式识别问题,近年来受到了广泛的关注,识别领域的各种方法在这个问题上各显所长,而且发展出了许多新方法,大大丰富和拓宽了模式识别的方向。人脸识别、检测,跟踪、特征定位等技术近年来一直是研究的热点。人脸识别是人脸应用…...

Leetcode Top 100 Liked Questions(序号53~74)
53. Maximum Subarray 题意:一个数组,找到和最大的子串 我的思路 我记得好像On的动态规划来做的?但是想不起来了,先死做,用的前缀和——TLE超时 那就只能想想dp怎么做了 假设dp[i]表示的是以 i 为右端点的最大的…...

Rabbitmq消息不丢失
目录 一、消息不丢失1.消息确认2.消息确认业务封装2.1 发送确认消息测试2.2 消息发送失败,设置重发机制 一、消息不丢失 消息的不丢失,在MQ角度考虑,一般有三种途径: 1,生产者不丢数据 2,MQ服务器不丢数据…...
Kotlin runBlocking launch多个协程读写mutableListOf时序
Kotlin runBlocking launch多个协程读写mutableListOf时序 import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main(args: Array<String>) {var lists mutableListOf<String>()runBlocking {launch {r…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...