Python-集合

本文介绍了Python集合的基本概念、定义及操作,包括可变集合set和不可变集合frozenset的创建、增删改查操作,并展示了集合之间的交集、并集、差集和判定等操作。示例代码详细解释了各种操作的实现和注意事项。
摘要由CSDN通过智能技术生成


一、集合是什么?

无序 不可随机访问 不可重复
与数学中集合的概念类似,可对其进行交、并、差、补等逻辑运算
分为可变集合(set)不可变集合(frozenset)

二、定义

可变集合set
s = {1,2,3,4}
s = set(iterable)
其中iterable可以是字符串、列表、元组、字典等
但是为dict时,只会获取提Key作为set的元
集合推导式
s = set(x**2 for x in range(1, 10) if x % 2 == 0)
s = {推导式}

s={1,2,3}
a="abc"
b=[1,2,3,a]
t=(1,2,a)
d={1:"1",2:"2",3:'3'}
st=set(x for x in range(0,10))
st1={x for x in range(0,10)}
print(s,type(s))
print(set(a),type(set(a)))
print(set(b), type(set(b)))
print(set(t),(type(set(t))))
print(set(t),type(set(d)))
print(st,type(st))
print(st1,type(st1))
结果:
{'a', 'b', 'c'} <class 'set'>
{'abc', 1, 2, 3} <class 'set'>
{'abc', 1, 2} <class 'set'>
{'abc', 1, 2} <class 'set'>
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>

不可变集合frozenset(与可变集合相比仅仅少了第一种,直接写花括号可以认为花括号指可变集合)
fs = frozenset(iterable)
其中iterable可以是字符串、列表、元组、字典等
但是为dict时,只会获取提Key作为set的元素
集合推导式
s = frozenset(x**2 for x in range(1, 10) if x % 2 == 0)

a="abc"
fs=frozenset(a)
fss=frozenset(x for x in range(0,10))
print(fs,type(fs))
print(fss,type(fss))
结果:
frozenset({'a', 'b', 'c'}) <class 'frozenset'>
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) <class 'frozenset'>

注意
1. 创建一个空集合时, 需要使用set() 或者 frozenset(), 不能使用 s = {}
会被识别成为字典
2. 集合中的元素, 必须是可哈希的值
如果一个对象在自己的生命周期中有一哈希值(hash value)是不可改变的,
那么它就是可哈希的(hashable)的
暂时理解为 不可变类型
3. 如果集合中的元素值出现重复, 则会被合并为1个

三、常用操作

1.单一集合操作

	可变集合
		增
			s.add(element)
			注意:
				必须保证添加的元素是可哈希的值
		删
			s.remove(element)
				指定删除set对象中的一个元素
				如果集合中没有这个元素,则返回一个错误
			s.discard(element)
				指定删除集合中的一个元素
				若没有这个元素,则do nothing
			s.pop()
				随机删除并返回一个集合中的元素(每次都弹出第一个元素)
				若集合为空,则返回一个错误
			s.clear()
				清空一个集合中的所有元素
		改
			元素为不可变类型, 不能修改
		查
			无法通过索引或key进行查询
			1. 通过 for in 进行遍历
			2. 通过迭代器进行访问
	不可变集合
		不能增删改
		查
			1. 通过 for in 进行遍历
			2. 通过迭代器进行访问
s={1,2,3,4,5,6,7,8,9,10}
a="abc"
fs=frozenset(a)
s.add(fs)
s.remove(3)
print(s.pop())
print(s)
its=iter(s)
print(next(its))
print("------")
for v in its:
 print(v)
 结果:
 1
{2, 4, 5, 6, 7, 8, 9, 10, frozenset({'c', 'a', 'b'})}
2(迭代器不会重新开始,上下两种迭代用的是同一个迭代器,所以 for in 接着第一次next遍历后)
------
4
5
6
7
8
9
10
frozenset({'c', 'a', 'b'})

2.集合之间操作

	交集
		intersection(Iterable)
			字符串
				只判定字符串中的非数字
			列表
			元组
			字典
				值判定key
			集合
			...
		逻辑与 '&'
		intersection_update(…)
			交集计算完毕后, 会再次赋值给原对象
				会更改原对象
				所以, 只适用于可变集合
a=[1,2,3,4,5,6,7,8,9]
s3=frozenset(a)
s1={1,2,3,4,5,6}
s2={4,5,8}
result=s1.intersection(s3)
result1=s1&s2
result2=s1.intersection_update(s2)
print(result,type(result))
print(s1,s3)
print(result1,type(result1))
print(s1,s2)
print(result2,type(result2))
print(s1,s2)
结果:
{1, 2, 3, 4, 5, 6} <class 'set'>
{4, 5} frozenset({1, 2, 3, 4, 5, 6, 7, 8, 9})
{4, 5} <class 'set'>
{4, 5} {8, 4, 5}
None <class 'NoneType'>
{4, 5} {8, 4, 5}
	并集
		union()
			返回并集
		逻辑或 '|'
			返回并集
		update()
			更新并集
s1={1,2,3}
s2=frozenset([1,2,3,4])
s3={2,5,6}
s4={7,8}
result=s1.union(s2)
result1=s1|s3
result2=s3.update(s4)
print(result,type(result))
print(result1,type(result1))
print(s3,result2,type(result2))
结果:
{1, 2, 3, 4} <class 'set'>
{1, 2, 3, 5, 6} <class 'set'>
{2, 5, 6, 7, 8} None <class 'NoneType'>
	差集
		difference()
		算术运算符减 ‘-‘
		difference_update()
s1={1,2,3}
s2=frozenset([1,2,3,4])
s3={2,5,6}
s4={7,8,6,2}
result=s2.difference(s1)
result1=s1-s3
result2=s3.difference_update(s4)
print(result,type(result))
print(result1,type(result1))
print(s3,result2,type(result2))
结果:
frozenset({4}) <class 'frozenset'>
{1, 3} <class 'set'>
{5} None <class 'NoneType'>
	判定
		isdisjoint()两个集合不相交
		issuperset()一个集合包含另一个集合
		issubset()一个集合包含于另一个集合
s1={1,2,3}
s2=frozenset([1,2,3,4])
s3={2,5,6}
s4={7,8,6,2}
print(s1.isdisjoint(s2))
print(s3.issuperset(s1))
print(s1.issubset(s2))
结果:
False
False
True

注意

	可变与不可变集合混合运算, 返回结果类型以运算符左侧为主
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值