python中set和frozenset方法和区别

本文详细介绍了Python中的两种集合类型:set(可变集合)与frozenset(不可变集合)。探讨了它们之间的区别,创建方法,以及如何进行更新、成员测试、子集/超集判断等操作。此外,还讲解了集合间的各种数学运算,如联合、交集、差集和对称差集。
引自:https://www.cnblogs.com/panwenbin-logs/p/5519617.html

set(可变集合)与frozenset(不可变集合)的区别
set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算.
sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, 或其它类序列的操作。
frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。


一、集合的创建

set()和 frozenset()工厂函数分别用来生成可变和不可变的集合。如果不提供任何参数,默认
会生成空集合。如果提供一个参数,则该参数必须是可迭代的,即,一个序列,或迭代器,或支持
迭代的一个对象,例如:一个列表或一个字典。

复制代码
 1 >>> s=set('cheeseshop')  使用工厂方法创建
 2 >>> s
 3 {'h', 'c', 'o', 's', 'e', 'p'}
 4 >>> type(s)
 5 <type 'set'>
 6 
 7 >>> s={'chessseshop','bookshop'}直接创建,类似于list的[]和dict的{},不同于dict的是其中的值,set会将其中的元素转换为元组
 8 >>> s
 9 {'bookshop', 'chessseshop'}
10 >>> type(s)
11 <type 'set'>
12 
13 不可变集合创建:
14 >>> t=frozenset('bookshop')
15 >>> t
16 frozenset({'h', 'o', 's', 'b', 'p', 'k'})
复制代码

二、更新可变集合

用各种集合内建的方法和操作符添加和删除集合的成员:

复制代码
 1 >>> s.add('z')  #添加
 2 >>> s
 3 set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
 4 >>> s.update('pypi') #添加
 5 >>> s
 6 set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])
 7 >>> s.remove('z') #删除
 8 >>> s
 9 set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
10 >>> s -= set('pypi')#删除
11 >>> s
12 set(['c', 'e', 'h', 'o', 's'])
13 >>> del s  #删除集合
复制代码

只有可变集合能被修改。试图修改不可变集合会引发异常。

1 >>> t.add('z')
2 Traceback (most recent call last):
3 File "<stdin>", line 1, in ?
4 AttributeError: 'frozenset' object has no attribute 'add'

三、成员关系 (in, not in)

1 >>> 'k' in s
2 False
3 >>> 'k' in t
4 True
5 >>> 'c' not in t
6 True

四、集合等价/不等价

复制代码
1 >>> s == t
2 False
3 >>> s != t
4 True
5 >>> u = frozenset(s)
6 >>> s == u
7 True
8 >>> set('posh') == set('shop')
9 True
复制代码

五、子集/超集

1 >>> set('shop') < set('cheeseshop')
2 True
3 >>> set('bookshop') >= set('shop')
4 True

六、遍历访问集合中的值(可变集合和非可变都支持)

复制代码
 1 >>> s=set('cheeseshop')
 2 >>> s
 3 {'h', 'c', 'o', 's', 'e', 'p'}
 4 >>> for i in s:
 5     print(i)    
 6 h
 7 c
 8 o
 9 s
10 e
11 p
12 
13 
14 >>> t=frozenset('bookshop')
15 >>> t
16 frozenset({'h', 'o', 's', 'b', 'p', 'k'})
17 >>> for i in t:
18     print(i)    
19 h
20 o
21 s
22 b
23 p
24 k
复制代码

七、集合类型操作符(所有的集合类型)

1.联合( | )

1 两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。联合符号有一个等价的方法,union().
2 >>> s | t
3 set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])

2.交集( & )

1 你可以把交集操作比做集合的 AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每
2 个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection()
3 >>> s & t
4 set(['h', 's', 'o', 'p']

3.差补/相对补集( – )

1 两个集合(s 和 t)的差补或相对补集是指一个集合 C,该集合中的元素,只属于集合 s,而不属
2 于集合 t。差符号有一个等价的方法,difference().
3 >>> s - t
4 set(['c', 'e'])

4.对称差分( ^ )

1 和其他的布尔集合操作相似, 对称差分是集合的 XOR(又称"异或 ").
2 两个集合(s 和 t)的对称差分是指另外一个集合 C,该集合中的元素,只能是属于集合 s 或者集合 t
3 的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference().
4 >>> s ^ t
5 set(['k', 'b', 'e', 'c'])

5.混合集合类型操作

复制代码
1 上面的示例中,左边的 s 是可变集合,而右边的 t 是一个不可变集合. 注意上面使用集合操作
2 运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了:
3 >>> t | s
4 frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
5 >>> t ^ s
6 frozenset(['c', 'b', 'e', 'k'])
7 >>> t - s frozenset(['k', 'b'])
复制代码

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

八、可变集合类型的方法

 

复制代码
 1 s.update(t) 用 t 中的元素修改 s, 即,s 现在包含 s 或 t 的成员
 2 s.intersection_update(t) s 中的成员是共同属于 s 和 t 的元素。
 3 s.difference_update(t) s 中的成员是属于 s 但不包含在 t 中的元素
 4 s.symmetric_difference_update(t) s 中的成员更新为那些包含在 s 或 t 中,但不 是 s
 5 和 t 共有的元素
 6 s.add(obj) 在集合 s 中添加对象 obj
 7 s.remove(obj) 从集合 s 中删除对象 obj;如果 obj 不是集合 s 中的元素(obj not
 8 in s),将引发 KeyError 错误
 9 s.discard(obj) 如果 obj 是集合 s 中的元素,从集合 s 中删除对象 obj;
10 s.pop() 删除集合 s 中的任意一个对象,并返回它
11 s.clear() 删除集合 s 中的所有元素
复制代码

九、集合类型操作符、函数和方法

函数/方法名 等价运算符 说明
所有集合类型:

复制代码
 1 len(s) 集合基数: 集合 s 中元素的个数
 2 set([obj]) 可变集合工厂函数; obj 必须是支持迭代的,由 obj 中
 3 的元素创建集合,否则创建一个空集合
 4 frozenset([obj]) 不可变集合工厂函数; 执行方式和 set()方法相同,
 5 但它返回的是不可变集合
 6 obj in s 成员测试:obj 是 s 中的一个元素吗?
 7 obj not in s 非成员测试:obj 不是 s 中的一个元素吗?
 8 s == t 等价测试: 测试 s 和 t 是否具有相同的元素?
 9 s != t 不等价测试: 与==相反
10 s < t (严格意义上)子集测试; s != t 而且 s 中 所 有
11 的元素都是 t 的成员
12 s.issubset(t) s <= t 子集测试(允许不严格意义上的子集): s 中所有的元素
13 都是 t 的成员
14 s > t (严格意义上)超集测试: s != t 而且 t 中所有的元素
15 都是 s 的成员
16 s.issuperset(t) s >= t 超集测试(允许不严格意义上的超集): t 中所有的元素
17 都是 s 的成员
18 s.union(t) s | t 合并操作: s 或 t 中的元素
19 s.intersec- tion(t) s & t 交集操作: s 和 t 中的元素
20 s.difference(t) s - t 差分操作: s 中的元素,而不是 t 中的元素
21 s.symmetric_difference(t)s ^ t 对称差分操作:s 或 t 中的元素,但不是 s 和 t 共有
22 的元素
23 s.copy() 复制操作:返回 s 的(浅复制)副本
复制代码

仅用于可变集合:

复制代码
 1 s.update(t) s |= t (Union) 修改操作: 将 t 中的成员添加 s
 2 s.intersection_update(t) s &= t 交集修改操作: s 中仅包括 s 和 t 中共有的成员
 3 s.difference_update(t) s -= t 差修改操作: s 中包括仅属于 s 但不属于 t 的成员
 4 s.symmetric_
 5 difference_
 6 update(t) s ^= t 对称差分修改操作: s 中包括仅属于 s 或仅属于 t 的
 7 成员
 8 s.add(obj) 加操作: 将 obj 添加到 s
 9 s.remove(obj) 删除操作: 将 obj 从 s 中删除;如果 s 中不存在
10 obj,将引发 KeyError
11 s.discard(obj) 丢弃操作: remove() 的 友 好 版 本 - 如
12 果 s 中存在 obj,
13 从 s 中删除它
14 s.pop() Pop 操作: 移除并返回 s 中的任意一个元素
15 s.clear() 清除操作: 移除 s 中的所有元素

<think>我们正在讨论Python中的set数据结构。根据引用,我们知道set是一种无序的、可变的数据结构,用于存储唯一的元素。它类似于数学中的集合,可以进行交集、并集、差集等操作。首先,我们来看set的定义。在Python中,set可以通过花括号{}或者set()函数来创建。注意,使用花括号时,如果只写{},会被认为是空字典,所以空集合必须用set()来创建。set的特性:1.无序:集合中的元素没有顺序,因此不能通过索引访问。2.元素唯一:集合会自动去除重复的元素。3.可变:可以添加或删除元素。4.元素必须是不可变类型:例如整数、浮点数、字符串、元组等,不能是列表、字典等可变类型。接下来,我们通过一些示例来展示set的使用方法。###创建集合```python#使用花括号fruits={"apple","banana","cherry"}print(fruits)#输出:{'banana','apple','cherry'}顺序可能不同#使用set()函数创建numbers=set([1,2,3,2])#从列表创建,重复元素会被去除print(numbers)#输出:{1,2,3}#空集合empty_set=set()print(empty_set)#输出:set()```###添加元素使用`add()`方法添加单个元素,使用`update()`方法添加多个元素(可以传入列表、元组、集合等)。```pythonfruits.add("orange")print(fruits)#例如:{'banana','orange','apple','cherry'}fruits.update(["mango","grape"])print(fruits)#添加了'mango''grape'```###删除元素-`remove(element)`:删除指定元素,如果元素不存在会引发KeyError。-`discard(element)`:删除指定元素,如果元素不存在不会报错。-`pop()`:随机删除并返回一个元素(因为集合无序),如果集合为空则引发KeyError。-`clear()`:清空集合。```pythonfruits.remove("banana")fruits.discard("watermelon")#不存在,不会报错popped_item=fruits.pop()#随机弹出一个元素print(popped_item)fruits.clear()print(fruits)#输出:set()```###集合运算-并集:`union()`或`|`-交集:`intersection()`或`&`-差集:`difference()`或`-`-对称差集(只存在于一个集合中的元素):`symmetric_difference()`或`^````pythonA={1,2,3}B={3,4,5}print(A.union(B))#{1,2,3,4,5}print(A|B)#同上print(A.intersection(B))#{3}print(A&B)#同上print(A.difference(B))#{1,2}print(A-B)#同上print(A.symmetric_difference(B))#{1,2,4,5}print(A^B)#同上```###其他常用方法-`len()`:获取集合元素个数。-`in`:检查元素是否在集合中。-`issubset()`或`<=`:判断子集。-`issuperset()`或`>=`:判断超集。```pythons={1,2,3}print(len(s))#3print(1ins)#Trueprint({1,2}.issubset(s))#Trueprint(s.issuperset({1,2}))#True```###不可变集合Python还提供了不可变集合`frozenset`,创建后不能改变。它可以作为字典的键,因为它是不可变的。```pythonfs=frozenset([1,2,3])print(fs)#frozenset({1,2,3})```通过以上介绍,我们了解了Pythonset的定义基本使用方法。集合在去重集合运算中非常有用。§§相关问题§§1.Pythonsetfrozenset有什么区别?2.如何用set去除列表中的重复元素?3.集合运算在实际编程中有哪些应用场景?4.为什么集合中的元素必须是不可变类型?</think>### Python Set 数据结构详解 #### 定义 集合(Set)是 Python 中的**无序可变容器**,用于存储**唯一不可变对象**。核心特性: 1. **元素唯一性**:自动去重,相同元素只保留一个 2. **无序存储**:元素无固定顺序(故不支持索引访问) 3. **可变性**:可动态增删元素 4. **哈希约束**:元素必须是不可变类型(如数字、字符串、元组) ```python # 创建方式 s1 = {1, 2, 3} # 直接声明 s2 = set([1, 2, 2, 3]) # 从列表转换 → {1, 2, 3} s3 = set("hello") # 从字符串创建 → {'h','e','l','o'} # 空集合必须用set() empty_set = set() # 正确!{} empty_dict = {} # 这是字典! ``` #### 基础操作 | 操作 | 方法/运算符 | 示例 | 结果 | |--------------|------------------|------------------------------|-------------------| | **添加元素** | `add()` | `s = {1}; s.add(2)` | `{1,2}` | | | `update()` | `s.update([3,4])` | `{1,2,3,4}` | | **删除元素** | `remove()` | `s.remove(4)` | `{1,2,3}` | | | `discard()` | `s.discard(99)` | 无异常 | | | `pop()` | `s.pop()` | 随机弹出元素 | | **查询** | `in` | `3 in s` | `True` | | **大小** | `len()` | `len(s)` | 元素数量 | #### 集合运算 ```python A = {1, 2, 3} B = {3, 4, 5} # 并集 A | B # {1,2,3,4,5} A.union(B) # 等效 # 交集 A & B # {3} A.intersection(B) # 差集 A - B # {1,2} A.difference(B) # 对称差集(仅出现一次的) A ^ B # {1,2,4,5} A.symmetric_difference(B) ``` #### 高级方法 ```python # 子集判断 {1,2}.issubset(A) # True # 超集判断 A.issuperset({1}) # True # 清空集合 A.clear() # set() # 冻结集合(不可变) frozen_set = frozenset([1,2,3]) # 可作为字典键 ``` #### 实际应用场景 1. **快速去重**: ```python lst = [1,2,2,3,4,4] unique = list(set(lst)) # [1,2,3,4] ``` 2. **成员检测**: ```python valid_users = {"Alice", "Bob", "Charlie"} if input_name in valid_users: ... ``` 3. **关系运算**: ```python # 求两列表共同元素 list1 = [1,2,3] list2 = [3,4,5] common = set(list1) & set(list2) # {3} ``` > 注意:因集合无序,`print(set)`的输出顺序可能每次不同[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值