全网最全Python数据结构集锦:集合(Set)篇

目录

1. 集合的三大特性

2. 基本操作

2.1 增加操作

2.2 删除操作

2.3 查找操作

2.4 集合遍历

3. 集合运算

4. 特殊集合


 本文源代码可以在这里找到:🔗

Set是一种常见的数据结构,在数学上的定义是,没有重复的元素的序列。 

1. 集合的三大特性

无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。

  • 集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。(参见序理论

互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。

  • 有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。

确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。

import gc
print("-"*10,"创建集合","-"*10)
myset1 = set()
myset2 = {}

print(myset1)
print(myset2)
print(type(myset1))
print(type(myset2))

# note:这里初始化集合有两种形式,但是使用大括号默认是dict属性
# 所以如果要用大括号,则必须要在括号内加入元素
myset3 = {1,2}
print(type(myset3))

del myset1, myset2, myset3
gc.collect()

输出:

---------- 创建集合 ----------
set()
{}
<class 'set'>
<class 'dict'>
<class 'set'>

2. 基本操作

2.1 增加操作

print("-"*10,"创建集合","-"*10)
myset = set()
print("\n初始化集合",myset)
myset.add(2)
myset.update([3,1])
print("\n加入元素", myset)


# 1. 去重性
# 重复加入元素
myset.add(2)
print("\n重复加入元素",myset)

# 2. 无序性
# 集合有自己的排列方法,不会按照插入的顺序排列
myset.add(3)
myset.add(1)
myset.add(6)
myset.add(11)
print(myset)

# 试一下字母
myset.clear()
myset.add('b')
myset.add('a')
myset.add('c')
myset.add('e')
print(myset)

输出:

---------- 集合添加 ----------

初始化集合 set()

加入元素 {1, 2, 3}

重复加入元素 {1, 2, 3}
{1, 2, 3, 6, 11}
{'c', 'a', 'e', 'b'}

2.2 删除操作

删除有两种操作
        1. set.discard(x) # 元素不存在也不会报错
        2. set.remove(x) # 元素不存在会报错

print("-"*10,"创建集合","-"*10)
myset = set([1,2,3])
print("\n初始化集合",myset)
myset.discard(1)
myset.remove(2)
print(myset)

# 清空集合
print("-"*10,"清空集合","-"*10)
myset.clear()
print(myset)
---------- 集合删除 ----------

初始化集合 {1, 2, 3}
{3}
---------- 清空集合 ----------
set()

2.3 查找操作

print("-"*10,"创建集合","-"*10)
myset = set([1,2,3])
print("\n初始化集合",myset)

print(1 in myset)
print(4 not in myset)
---------- 集合查找 ----------

初始化集合 {1, 2, 3}
True
True

2.4 集合遍历

print("-"*10,"集合遍历","-"*10)
myset = set([1,2,3])
print("\n初始化集合",myset,"\n")
print("-"*10,"打印集合","-"*10)
for ele in myset:
    print(ele)
---------- 集合遍历 ----------

初始化集合 {1, 2, 3} 

---------- 打印集合 ----------
1
2
3

3. 集合运算

  • 并集:两个集合可以相"加"。A和B的并集是将A和B的元素放到一起构成的新集合。
  • 交集:一个新的集合也可以通过两个集合"共"有的元素来构造。A和B的交集,写作A∩B,是既属于A的、又属于B的所有元素组成的集合。
  • 差集: 两个集合也可以相"减"。A在B中的相对补集,写作B−A,是属于B的、但不属于A的所有元素组成的集合。 在特定情况下,所讨论的所有集合是一个给定的全集U的子集。这样,U−A称作A的绝对补集,或简称补集(余集),写作A′或CUA。 补集可以看作两个集合相减,有时也称作差集。
  • 对称差集:给定集合A,B,定义对称差运算△如下:A△B = (A-B)∪(B-A)。
print("-"*10,"集合运算","-"*10)
myset1 = set([1,2,3])
myset2 = set([2,3,4])
print("\n初始化集合1",myset1,"\n")
print("\n初始化集合2",myset2,"\n")

import time

myset3 = myset1 | myset2
print("-"*10,"集合并集","-"*10)
print(myset3,'\n')

myset3 = myset1 & myset2
print("-"*10,"集合交集","-"*10)
print(myset3,'\n')

myset3 = myset1 - myset2
print("-"*10,"集合差集","-"*10)
print(f"{myset1} 与 ({myset1} 和 {myset2} 的交集) 的差集")
print(myset3,'\n')

myset3 = myset1 ^ myset2
print("-"*10,"集合对称差集","-"*10)
print(f"({myset1} 和 {myset2} 的并集) 与 ({myset1} 和 {myset2} 的交集) 的差集")
print(myset3,'\n')


# 集合运算两种形式的比较,通过多次运行,没有太看出时间上太大的差异,可能是元素有限的关系
# 小样本的话可以选择直接用符号运算,写起来比较快。
print("-"*10,"创建集合","-"*10)
myset1 = set([1,2,3,5,6,7,8,10,12,34,5,6])
myset2 = set([2,3,4,11,22,44,13,25,18,34])
# set 集合方法
start = time.time()
myset3 = myset1.union(myset2)
print("并集",myset3)
myset3 = myset1.intersection(myset2)
print("交集",myset3)
myset3 = myset1.difference(myset2)
print("差集",myset3)
myset3 = myset1.symmetric_difference(myset2)
print("对称差集",myset3)
print(time.time()-start)

start = time.time()
myset3 = myset1 | myset2
print("并集",myset3)
myset3 = myset1 & myset2
print("交集",myset3)
myset3 = myset1 - myset2
print("差集",myset3)
myset3 = myset1 ^ myset2
print("对称差集",myset3)
print(time.time()-start)
---------- 集合运算 ----------

初始化集合1 {1, 2, 3} 


初始化集合2 {2, 3, 4} 

---------- 集合并集 ----------
{1, 2, 3, 4} 

---------- 集合交集 ----------
{2, 3} 

---------- 集合差集 ----------
{1, 2, 3} 与 ({1, 2, 3} 和 {2, 3, 4} 的交集) 的差集
{1} 

---------- 集合对称差集 ----------
({1, 2, 3} 和 {2, 3, 4} 的并集) 与 ({1, 2, 3} 和 {2, 3, 4} 的交集) 的差集
{1, 4} 

---------- 创建集合 ----------
并集 {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 18, 22, 25, 34, 44}
交集 {2, 3, 34}
差集 {1, 5, 6, 7, 8, 10, 12}
对称差集 {1, 4, 5, 6, 7, 8, 10, 11, 44, 13, 12, 18, 22, 25}
0.0006961822509765625
并集 {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 18, 22, 25, 34, 44}
交集 {2, 3, 34}
差集 {1, 5, 6, 7, 8, 10, 12}
对称差集 {1, 4, 5, 6, 7, 8, 10, 11, 44, 13, 12, 18, 22, 25}
0.00032210350036621094

4. 特殊集合

myfrozenset = frozenset({'a','b','d','e'})
print(myfrozenset)
myfrozenset.add('c')
# frozenset 为不可变集合,创立了不可改变
frozenset({'a', 'd', 'e', 'b'})
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-61-c419b8ac6d1d> in <module>
      1 print(myfrozenset)
----> 2 myfrozenset.add('c')
      3 # frozenset 为不可变集合,创立了不可改变

AttributeError: 'frozenset' object has no attribute 'add'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值