文章目录
一、python中的集合
在 Python 中,集合(set) 是一种无序的、可变的、元素唯一的数据结构。集合类似于数学中的集合概念,主要用于存储不重复的元素,并支持集合运算(如交集、并集、差集等)。
集合的特点
- 无序性:
- 集合中的元素没有顺序,无法通过索引访问。
- 元素唯一性:
- 集合中的元素是唯一的,重复的元素会被自动去重。
- 可变性:
- 集合本身是可变的,可以添加或删除元素,但集合中的元素必须是不可变的(如数字、字符串、元组等)。
集合的创建
-
使用大括号
{}
:my_set = {1, 2, 3, 4} print(my_set) # 输出:{1, 2, 3, 4}
-
使用
set()
构造函数:my_set = set([1, 2, 3, 4]) print(my_set) # 输出:{1, 2, 3, 4}
-
创建空集合:
- 注意:空集合必须使用
set()
,因为{}
会被默认认为是空字典。
empty_set = set() print(empty_set) # 输出:set()
- 注意:空集合必须使用
集合的常见操作
1. 添加元素
-
使用
add()
方法添加单个元素:my_set = {1, 2, 3} my_set.add(4) print(my_set) # 输出:{1, 2, 3, 4}
-
使用
update()
方法添加多个元素:my_set.update([5, 6]) print(my_set) # 输出:{1, 2, 3, 4, 5, 6}
2. 删除元素
-
使用
remove()
方法删除指定元素(如果元素不存在会抛出错误):my_set.remove(3) print(my_set) # 输出:{1, 2, 4}
-
使用
discard()
方法删除指定元素(如果元素不存在不会抛出错误):my_set.discard(10) # 不会报错
-
使用
pop()
方法随机删除一个元素,并返回该元素:removed_element = my_set.pop() print(removed_element) # 输出:随机删除的元素
-
使用
clear()
方法清空集合:my_set.clear() print(my_set) # 输出:set()
3. 检查元素是否存在
- 使用
in
和not in
:print(2 in my_set) # 输出:True print(10 not in my_set) # 输出:True
集合的运算
1. 交集(&
或 intersection()
)
- 返回两个集合的公共元素。
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1 & set2) # 输出:{2, 3}
print(set1.intersection(set2)) # 输出:{2, 3}
2. 并集(|
或 union()
)
- 返回两个集合的所有元素(去重)。
print(set1 | set2) # 输出:{1, 2, 3, 4}
print(set1.union(set2)) # 输出:{1, 2, 3, 4}
3. 差集(-
或 difference()
)
- 返回在一个集合中但不在另一个集合中的元素。
print(set1 - set2) # 输出:{1}
print(set1.difference(set2)) # 输出:{1}
4. 对称差集(^
或 symmetric_difference()
)
- 返回两个集合中不重复的元素。
print(set1 ^ set2) # 输出:{1, 4}
print(set1.symmetric_difference(set2)) # 输出:{1, 4}
集合的其他方法
1. 子集和超集
- 检查一个集合是否是另一个集合的子集或超集:
set1 = {1, 2} set2 = {1, 2, 3} print(set1.issubset(set2)) # 输出:True print(set2.issuperset(set1)) # 输出:True
2. 集合的拷贝
- 使用
copy()
方法创建集合的副本:set1 = {1, 2, 3} set_copy = set1.copy() print(set_copy) # 输出:{1, 2, 3}
冻结集合(frozenset
)
frozenset
是不可变的集合,创建后无法修改(类似于元组与列表的关系)。- 用法:
frozen = frozenset([1, 2, 3]) print(frozen) # 输出:frozenset({1, 2, 3})
示例
# 定义集合
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 集合运算
print("交集:", set1 & set2) # 输出:{3}
print("并集:", set1 | set2) # 输出:{1, 2, 3, 4, 5}
print("差集:", set1 - set2) # 输出:{1, 2}
print("对称差集:", set1 ^ set2) # 输出:{1, 2, 4, 5}
# 添加和删除元素
set1.add(6)
set1.remove(2)
print("修改后的集合:", set1) # 输出:{1, 3, 6}
总结
- 集合是无序且唯一的元素集合,适合用于去重和集合运算。
- 提供了丰富的操作方法,如交集、并集、差集等。
- 如果需要不可变集合,可以使用
frozenset
。
二、与js中的set对比
Python 中的 集合(set) 和 JavaScript 中的 Set 非常相似,它们的核心功能和用途基本一致,都是用于存储 唯一值 的无序集合,并支持集合运算(如交集、并集、差集等)。
相似点
1. 存储唯一值
-
Python 集合:
my_set = {1, 2, 2, 3} print(my_set) # 输出:{1, 2, 3}(自动去重)
-
JavaScript Set:
const mySet = new Set([1, 2, 2, 3]); console.log(mySet); // 输出:Set(3) { 1, 2, 3 }(自动去重)
2. 添加元素
-
Python 集合:
my_set = {1, 2, 3} my_set.add(4) print(my_set) # 输出:{1, 2, 3, 4}
-
JavaScript Set:
const mySet = new Set([1, 2, 3]); mySet.add(4); console.log(mySet); // 输出:Set(4) { 1, 2, 3, 4 }
3. 删除元素
-
Python 集合:
my_set = {1, 2, 3} my_set.remove(2) print(my_set) # 输出:{1, 3}
-
JavaScript Set:
const mySet = new Set([1, 2, 3]); mySet.delete(2); console.log(mySet); // 输出:Set(2) { 1, 3 }
4. 检查元素是否存在
-
Python 集合:
my_set = {1, 2, 3} print(2 in my_set) # 输出:True print(4 in my_set) # 输出:False
-
JavaScript Set:
const mySet = new Set([1, 2, 3]); console.log(mySet.has(2)); // 输出:true console.log(mySet.has(4)); // 输出:false
5. 清空集合
-
Python 集合:
my_set = {1, 2, 3} my_set.clear() print(my_set) # 输出:set()
-
JavaScript Set:
const mySet = new Set([1, 2, 3]); mySet.clear(); console.log(mySet); // 输出:Set(0) {}
6. 遍历集合
-
Python 集合:
my_set = {1, 2, 3} for item in my_set: print(item) # 输出: # 1 # 2 # 3
-
JavaScript Set:
const mySet = new Set([1, 2, 3]); mySet.forEach(item => console.log(item)); // 输出: // 1 // 2 // 3
不同点
1. 集合运算
-
Python 集合 支持直接的集合运算(如交集、并集、差集等),而 JavaScript Set 需要通过手动实现或借助工具库完成。
-
Python 集合运算:
set1 = {1, 2, 3} set2 = {2, 3, 4} print(set1 & set2) # 交集:{2, 3} print(set1 | set2) # 并集:{1, 2, 3, 4} print(set1 - set2) # 差集:{1} print(set1 ^ set2) # 对称差集:{1, 4}
-
JavaScript Set 运算(需要手动实现):
const set1 = new Set([1, 2, 3]); const set2 = new Set([2, 3, 4]); // 交集 const intersection = new Set([...set1].filter(x => set2.has(x))); console.log(intersection); // 输出:Set(2) { 2, 3 } // 并集 const union = new Set([...set1, ...set2]); console.log(union); // 输出:Set(4) { 1, 2, 3, 4 } // 差集 const difference = new Set([...set1].filter(x => !set2.has(x))); console.log(difference); // 输出:Set(1) { 1 }
2. 键值对支持
- Python 集合 只能存储单一的值,不能存储键值对。
- JavaScript Set 也只能存储单一值,但如果需要键值对,可以使用
Map
。
总结
-
相似点:
- Python 的集合(
set
)和 JavaScript 的Set
都是存储唯一值的无序集合。 - 它们都支持添加、删除、检查元素是否存在等基本操作。
- Python 的集合(
-
不同点:
- Python 集合支持直接的集合运算(如交集、并集等),而 JavaScript 的
Set
需要手动实现这些操作。 - Python 集合有更丰富的内置方法,而 JavaScript 的
Set
功能相对简单。
- Python 集合支持直接的集合运算(如交集、并集等),而 JavaScript 的
可以理解为 Python 的集合(set
)是 JavaScript 的 Set
的扩展版本,功能更强大,尤其在集合运算方面。