[Python3] 013 集合:你不能两次进入同一个集合
0. 集合的独白
- 英文名: set
- 我是数学中的一个基本概念,记得高中的“数学必修一”开篇讲的就是我;当然,高等数学开篇也是讲我。
- 我可以没有元素,即“空集”
- 我的元素排名不分先后,即“无序”
- “弱水三千,只取一瓢饮”,即“不重复”
1. 集合的创建
- 少废话,上例子
# 例1
s1_1 = set()
s1_2 = {1, 2, 3, 4, 5}
print(s1_1)
print(type(s1_1))
print('-'*20)
print(s1_2)
print(type(s1_2))
- 运行结果
set()
<class 'set'>
--------------------
{1, 2, 3, 4, 5}
<class 'set'>
# 例2
s2 = {}
print(s2)
print(type(s2))
- 运行结果
{}
<class 'dict'>
集合和“字典”都是用大括号括起来,并且空的大括号默认表示“字典”。
关于“字典”,就不挖坑了,讲完集合,之后就是“字典”。
2. 集合的特性
(1) 概述
- 集合内数据“无序”,所以无法使用索引与分片
- 集合内数据元素具有唯一性,所以可以用来排除重复数据
- 集合内部只能放置可哈希数据,如 str、int、float、tuple、冰冻集合等
- 关于“可哈希”与“不可哈希”,挖个坑,日后填平,编号 Py013-1
- 序列运算、成员检测等
(2) 少废话,上例子
# 例3.1 序列不可相加
t3_1 = {1, 2, 3}
t3_2 = {4, 5, 6}
print(t3_1)
t3_1 = t3_1 + t3_2
print(t3_1)
- 运行结果
{1, 2, 3}
TypeError……unsupported operand type(s) for +: 'set' and 'set'
集合不支持相加。
# 例3.2 序列可减
s3_3 = {1, 2, 3, 4, 5}
s3_4 = {4, 5}
s3_5 = {4, 5, 6, 7}
s3_6 = s3_3 - s3_4
s3_7 = s3_3 - s3_5
print(s3_6)
print(s3_7)
- 运行结果
{1, 2, 3}
{1, 2, 3}
集合间可使用“减法”,这种减法与概率统计中的减法很像。
# 例4 成员检测
s4 = {1, 2, 3, "I", "am", "YorkFish"}
print(s4)
if "YorkFish" in s4:
print("Yes.")
if "6" not in s4:
print("No.")
- 运行结果
{'I', 1, 2, 3, 'am', 'YorkFish'}
Yes.
No.
3. 集合的遍历
- 少废话,上例子
# 例5 for 循环
s5 = {1, 2, 3, "I", "am", "YorkFish"}
for i in s5:
print(i, end=' ') # end 是一个空格
- 运行结果
I 1 2 3 am YorkFish
# 例6 集合内部嵌套了元组的遍历
s6 = {(1,2,3), ("I","am","YorkFish"), (4,5,6)}
for i in s6:
print(i)
print('-'*30)
for k,m,n in s6:
print(k, "---", m, "---", n)
- 运行结果
(4, 5, 6)
('I', 'am', 'YorkFish')
(1, 2, 3)
------------------------------
4 --- 5 --- 6
I --- am --- YorkFish
1 --- 2 --- 3
4. 集合内涵
- 少废话,上例子
# 例7 普通的集合内涵
s7_1 = {6, 8, 34, 21, 56, 35, 6, 21, 9}
print(s7_1)
s7_2 = {i for i in s7_1}
print(s7_2)
- 运行结果
{34, 35, 6, 8, 9, 21, 56}
2229867508904
{34, 35, 6, 8, 9, 21, 56}
2229867508904
s7_1 与 s7_2 指向同一片地址,说明它们是同一个集合。
# 例8 带条件的集合内涵
s8_1 = {6, 8, 34, 21, 56, 35, 6, 21, 9}
s8_2 = {i for i in s8_1 if i % 2 == 0} # 取出 s8_1 的偶数
print(s8_1)
print(s8_2)
- 运行结果
{34, 35, 6, 8, 9, 21, 56}
{8, 34, 56, 6}
# 例9 多循环的集合内涵
s9_1 = {1, 2, 3}
s9_2 = {"I", "am", "YorkFish"}
s9_3 = {m*n for m in s9_1 for n in s9_2}
print(s9_3)
s9_4 = {m*n for m in s9_1 for n in s9_2 if m == 2}
print(s9_4)
- 运行结果
{'I', 'am', 'YorkFish', 'YorkFishYorkFishYorkFish', 'II', 'III', 'amam', 'YorkFishYorkFish', 'amamam'}
{'II', 'YorkFishYorkFish', 'amam'}
5. 集合的内置方法
- Python3.7 中,除去魔法方法,集合有17个内置方法,详见 [Python3] 014 集合的内置方法。
6. 可供集合使用的一些方法/函数
(1) 又见测量君与最值双子
# 例10 len() max() min() 跟其他地方的用法基本一致
s10 = {6, 8, 34, 21, 56, 35, 6, 21, 9}
print(len(s10))
print( max(s10))
print(min(s10))
- 运行结果
7
56
6
(2) “打不过就加入他们”
# 例11
list11_1 = [6, 8, 34, 21, 56, 35, 6, 21, 9]
s11_1 = set(list11_1)
print(s11_1)
s11_2 = {6, 8, 34, 21, 56, 35, 6, 21, 9}
list11_2 = list(s11_2)
print(list11_2)
- 运行结果
{34, 35, 6, 8, 9, 21, 56}
[34, 35, 6, 8, 9, 21, 56]
元组也是这样的。
(3) 冷酷的 frozenset
- frozenset 即冰冻集合,是一种特殊的集合
- frozenset 是不可以进行任何修改的集合
- frozenset 有 8 个非魔法方法的方法
- 简单举例
# 例12 创建
s12 = frozenset()
print(s12)
print(type(s12))
- 运行结果
frozenset()
<class 'frozenset'>
[Python3] 013 集合:你不能两次进入同一个集合的更多相关文章
- Set集合对象比较两个元素的方法
Set集合对象比较两个元素的方法并不是根据“equals()”方法的返回值来比较.而是用“hashCode()”方法来进行判断.只要两个元素的“hashCode()”方法的返回值相同,就认为两个元素相 ...
- python3 第十五章 - 数据类型之Sets(集合)
python的官网里对集合的描述是: Python also includes a data type for sets. A set is an unordered collection with ...
- C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)
/// <summary> /// 实体差异比较器 /// </summary> /// <param name="source">源版本实体& ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- Java 单个集合去重与两个集合去重
一.单个集合去重 描述: 去掉一个集合里重复的元素:将list集合转成hashSet集合,hashSet有自动去重的功能,再利用去重后的hashSet集合初始化一个新的list集合,此时这个list就 ...
- java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作
在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 //在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 List<String> a ...
- Collection两个常见的集合类型: ArrayList可重复集有序 ,HashSet不可重复集
package seday11; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; ...
- POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典
题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...
- Map集合迭代的两种方法
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; pub ...
随机推荐
- bzoj3091 城市旅行 LCT + 区间合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3091 题解 调了整个晚自习才调出来的问题. 乍一看是个 LCT 板子题. 再看一眼还是个 LC ...
- css使既有浮动又有左右margin的多个元素两端对其
两端对齐效果 如上图中红色的9个div它们中间有间距,而最左边和最右边是没有间距的,这种布局如果使用css3的flex来实现是非常简单的,而如果要使用float布局就需要一些特殊的技巧了. 实现原理 ...
- puppet使用rsync模块
puppet使用rsync模块同步目录和文件 环境说明: OS : CentOS5.4 i686puppet版本: ...
- zrender笔记----(数字Number组件)出现的问题和解决办法
1.期望的效果是这样子的(这也是最终结果): 2.开始是用json假数据,开始没考虑null的问题,导致在判断传值处,判断有误. 导致在对接接口时,凌乱了,后来修改了下变成后面图C的逻辑,json数据 ...
- STM32内部硬核的认识
STM32内部含有硬核,对于一些协议(例如:UART,SPI,IIC,CRC等)我们只要调用硬核就可以了,同时我们也可以自己写通信协议. 这些硬核最终肯定是要有引脚输出的,这就是为什么STM32的引脚 ...
- Java——this
[this] 在没有new一个对象前,this不知道指的是什么:当new出一个对象时,this指的是当前对象的引用.
- Internet History, Technology, and Security(week5)——Technology: Internets and Packets
前言: 之前都在学习Internet的历史,从这周开始,进入到了Internet技术的学习. Layer1: Link Introduction / The Link Layer 80年代之前,主流网 ...
- [洛谷P5106]dkw的lcm:欧拉函数+容斥原理+扩展欧拉定理
分析 考虑使用欧拉函数的计算公式化简原式,因为有: \[lcm(i_1,i_2,...,i_k)=p_1^{q_{1\ max}} \times p_2^{q_{2\ max}} \times ... ...
- Spring Cloud Commons教程(三)忽略网络接口
有时,忽略某些命名网络接口是有用的,因此可以将其从服务发现注册中排除(例如,在Docker容器中运行).可以设置正则表达式的列表,这将导致所需的网络接口被忽略.以下配置将忽略“docker0”接口和以 ...
- H. The Game of Life
题目链接:http://exam.upc.edu.cn/problem.php?id=5206 题意:邻居为八个方向.若一个活人有2或3个邻居,遗传一代,否则死亡:若一个死人有3个邻居,则下一代复活. ...