python 集合

Python 集合 (Sets)

1. 集合的定义 (Definition)

集合是 Python 中的一种数据结构,用于存储唯一的、无序的元素集合。集合的主要特点是:

  • 元素不重复(唯一性)
  • 元素无序(不支持索引访问)
  • 元素必须是可哈希的(不可变类型,如数字、字符串、元组)
  • 集合本身是可变的(可以添加或删除元素)
  • 使用花括号 {} 表示(空集合除外)

集合特别适合用于成员测试、消除重复项和计算数学集合运算(如交集、并集、差集等)。

2. 创建集合 (Creating Sets)

2.1 使用花括号创建

# 创建非空集合
fruits = {'apple', 'banana', 'orange', 'apple'}  # 重复元素会自动去除
print(fruits)  # 输出: {'orange', 'banana', 'apple'} (顺序可能不同)

# 注意:创建空集合不能使用 {},因为这会创建空字典
# 错误方式:empty_set = {}  # 这实际上创建了一个字典

2.2 使用 set() 构造函数创建

# 创建空集合
empty_set = set()

# 从其他可迭代对象创建集合
set_from_list = set([1, 2, 3, 2, 1])  # 从列表创建
print(set_from_list)  # 输出: {1, 2, 3}

set_from_string = set('hello')  # 从字符串创建
print(set_from_string)  # 输出: {'h', 'e', 'l', 'o'} (注意 'l' 只出现一次)

2.3 使用集合推导式创建

# 创建一个包含偶数的集合
even_numbers = {x for x in range(10) if x % 2 == 0}
print(even_numbers)  # 输出: {0, 2, 4, 6, 8}

3. 集合的基本操作 (Basic Operations)

3.1 查询元素 (Checking Elements)

fruits = {'apple', 'banana', 'orange'}

# 检查元素是否存在于集合中
print('apple' in fruits)  # 输出: True
print('grape' in fruits)  # 输出: False

3.2 添加元素 (Adding Elements)

fruits = {'apple', 'banana'}

# 添加单个元素
fruits.add('orange')
print(fruits)  # 输出: {'apple', 'banana', 'orange'}

# 添加多个元素
fruits.update(['grape', 'mango', 'apple'])  # 添加可迭代对象中的所有元素,重复的会被忽略
print(fruits)  # 输出: {'apple', 'banana', 'orange', 'grape', 'mango'}

3.3 删除元素 (Removing Elements)

fruits = {'apple', 'banana', 'orange', 'grape', 'mango'}

# 使用 remove() 方法删除元素 (如果元素不存在,会引发 KeyError)
fruits.remove('apple')
print(fruits)  # 输出: {'banana', 'orange', 'grape', 'mango'}

# 使用 discard() 方法删除元素 (如果元素不存在,不会引发错误)
fruits.discard('banana')
fruits.discard('pear')  # 不会报错,即使 'pear' 不在集合中
print(fruits)  # 输出: {'orange', 'grape', 'mango'}

# 使用 pop() 方法随机删除并返回一个元素
fruit = fruits.pop()  # 由于集合是无序的,pop 会随机移除一个元素
print(fruit)  # 输出: 被移除的元素
print(fruits)  # 输出: 剩余的元素

# 使用 clear() 方法清空集合
fruits.clear()
print(fruits)  # 输出: set()

4. 集合的常用方法 (Common Set Methods)

4.1 基本方法

# 创建两个集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# copy() - 复制集合
set1_copy = set1.copy()
print(set1_copy)  # 输出: {1, 2, 3, 4, 5}

# len() - 获取集合长度
print(len(set1))  # 输出: 5

# max() 和 min() - 获取集合中的最大和最小值
print(max(set1))  # 输出: 5
print(min(set1))  # 输出: 1

4.2 集合运算方法

有集合的方法和运算符两种方式,其中方法可以使用可迭代对象(列表、元组、集合、字典、字符串),而运算符只可以使用集合。

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# union() - 并集:返回包含两个集合所有元素的新集合
union_set = set1.union(set2)  # 或使用 set1 | set2
print(union_set)  # 输出: {1, 2, 3, 4, 5, 6, 7, 8}

# intersection() - 交集:返回包含两个集合共有元素的新集合
intersection_set = set1.intersection(set2)  # 或使用 set1 & set2
print(intersection_set)  # 输出: {4, 5}

# difference() - 差集:返回包含在第一个集合但不在第二个集合中的元素的新集合
difference_set = set1.difference(set2)  # 或使用 set1 - set2
print(difference_set)  # 输出: {1, 2, 3}

# symmetric_difference() - 对称差集:返回包含在一个集合中但不在两个集合交集中的元素的新集合
symmetric_difference_set = set1.symmetric_difference(set2)  # 或使用 set1 ^ set2
print(symmetric_difference_set)  # 输出: {1, 2, 3, 6, 7, 8}
  • >(真子集):判断一个集合是否是另一个集合的真子集。

    s1 = {1, 2, 3}
    s2 = {1, 2, 3, 4, 5}
    print(s1 < s2)  # 输出:True,因为 s1 是 s2 的真子集
    
  • <(真超集):判断一个集合是否是另一个集合的真超集。

    print(s2 > s1)  # 输出:True,因为 s2 是 s1 的真超集
    
  • ==(相等):判断两个集合是否相等。

    s3 = {1, 2, 3}
    print(s1 == s3)  # 输出:True,因为 s1 和 s3 的元素完全相同
    
  • <=(子集):判断一个集合是否是另一个集合的子集。

    print(s1 <= s2)  # 输出:True,因为 s1 是 s2 的子集
    
  • >=(超集):判断一个集合是否是另一个集合的超集。

    print(s2 >= s1)  # 输出:True,因为 s2 是 s1 的超集
    
  • |(并集):返回两个集合的并集。

    s1 = {1, 2, 3}
    s2 = {3, 4, 5}
    print(s1 | s2)  # 输出:{1, 2, 3, 4, 5}
    
  • &(交集):返回两个集合的交集。

    print(s1 & s2)  # 输出:{3}
    
  • -(差集):返回两个集合的差集。

    print(s1 - s2)  # 输出:{1, 2}
    print(s2 - s1)  # 输出:{4, 5}
    
  • ^(对称差集):返回两个集合的对称差集,即两个集合中不共有的元素。

    print(s1 ^ s2)  # 输出:{1, 2, 4, 5}
    
s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3}

# 集合关系判断
print(s1 < s2)  # True,s1 是 s2 的真子集
print(s2 > s1)  # True,s2 是 s1 的真超集
print(s1 == s3)  # True,s1 和 s3 相等
print(s1 <= s2)  # True,s1 是 s2 的子集
print(s2 >= s1)  # True,s2 是 s1 的超集

# 集合运算
print(s1 | s2)  # {1, 2, 3, 4, 5},并集
print(s1 & s2)  # {3},交集
print(s1 - s2)  # {1, 2},差集
print(s2 - s1)  # {4, 5},差集
print(s1 ^ s2)  # {1, 2, 4, 5},对称差集

4.3 就地修改集合的方法

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# update() - 并集更新:将另一个集合的元素添加到当前集合中
set1.update(set2)  # 或使用 set1 |= set2
print(set1)  # 输出: {1, 2, 3, 4, 5, 6, 7, 8}

# 重新初始化集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# intersection_update() - 交集更新:保留同时存在于两个集合中的元素
set1.intersection_update(set2)  # 或使用 set1 &= set2
print(set1)  # 输出: {4, 5}

# 重新初始化集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# difference_update() - 差集更新:移除当前集合中存在于另一个集合中的元素
set1.difference_update(set2)  # 或使用 set1 -= set2
print(set1)  # 输出: {1, 2, 3}

# 重新初始化集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# symmetric_difference_update() - 对称差集更新:仅保留存在于一个集合中而不存在于两个集合交集中的元素
set1.symmetric_difference_update(set2)  # 或使用 set1 ^= set2
print(set1)  # 输出: {1, 2, 3, 6, 7, 8}

4.4 集合关系判断方法

set1 = {1, 2, 3, 4, 5}
set2 = {1, 2, 3}
set3 = {6, 7, 8}

# issubset() - 判断一个集合是否为另一个集合的子集
print(set2.issubset(set1))  # 输出: True (set2 是 set1 的子集)
print(set2 <= set1)  # 输出: True (使用运算符)

# issuperset() - 判断一个集合是否为另一个集合的超集
print(set1.issuperset(set2))  # 输出: True (set1 是 set2 的超集)
print(set1 >= set2)  # 输出: True (使用运算符)

# isdisjoint() - 判断两个集合是否没有交集
print(set1.isdisjoint(set3))  # 输出: True (set1 和 set3 没有交集)
print(set1.isdisjoint(set2))  # 输出: False (set1 和 set2 有交集)

5. 集合的高级用法 (Advanced Usage)

5.1 不可变集合 (frozenset)

# 创建不可变集合
frozen = frozenset([1, 2, 3, 4])
print(frozen)  # 输出: frozenset({1, 2, 3, 4})

# frozen.add(5)  # 错误! frozenset 是不可变的,不支持添加元素

# 可以用作字典的键
dict_with_set_keys = {frozen: "This is a frozen set as key"}
print(dict_with_set_keys[frozen])  # 输出: This is a frozen set as key

5.2 使用集合去重

# 使用集合去除列表中的重复元素
numbers = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique_numbers = list(set(numbers))
print(unique_numbers)  # 输出: [1, 2, 3, 4, 5] (顺序可能不同)

# 保持原列表顺序的去重方法
def remove_duplicates(items):
    seen = set()
    result = []
    for item in items:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

ordered_unique = remove_duplicates(numbers)
print(ordered_unique)  # 输出: [1, 2, 3, 4, 5] (保留原始顺序)

5.3 集合推导式高级用法

# 多条件集合推导式
numbers = {x for x in range(100) if x % 2 == 0 if x % 5 == 0}
print(numbers)  # 输出: {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}

# 嵌套集合推导式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = {x for row in matrix for x in row}
print(flattened)  # 输出: {1, 2, 3, 4, 5, 6, 7, 8, 9}

5.4 集合与其他数据结构的转换

# 列表转集合
my_list = [1, 2, 2, 3, 4]
my_set = set(my_list)
print(my_set)  # 输出: {1, 2, 3, 4}

# 集合转列表
my_list_again = list(my_set)
print(my_list_again)  # 输出: [1, 2, 3, 4] (顺序可能不同)

# 元组转集合
my_tuple = (1, 2, 2, 3, 4)
my_set = set(my_tuple)
print(my_set)  # 输出: {1, 2, 3, 4}

# 集合转元组
my_tuple_again = tuple(my_set)
print(my_tuple_again)  # 输出: (1, 2, 3, 4) (顺序可能不同)

# 字符串转集合
my_string = "hello"
my_set = set(my_string)
print(my_set)  # 输出: {'h', 'e', 'l', 'o'}

# 集合转字符串
my_string_again = ''.join(my_set)  # 注意:顺序不确定
print(my_string_again)  # 输出: 例如 "helo" (顺序可能不同)

6. 总结 (Summary)

Python 集合是一种高效的数据结构,特别适用于以下场景:

  1. 需要确保元素唯一性
  2. 频繁进行成员检查操作
  3. 需要进行数学集合运算(并集、交集、差集等)
  4. 需要消除重复元素

集合的主要特性:

  1. 无序性 - 元素没有特定顺序
  2. 唯一性 - 不允许重复元素
  3. 可变性 - 可以添加和删除元素(除了 frozenset)
  4. 只能包含可哈希(不可变)的元素

掌握 Python 集合的使用能够提高代码效率,尤其是在处理数据去重、元素归属检查和集合运算等场景时。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值