Python集合基础

集合是Python中用于存储唯一元素的无序数据类型。本教程将帮助你掌握集合的概念和常用操作,以及在实际编程中的应用场景。

集合简介

什么是集合?

集合是一个无序的、不重复的数据集合,它具有以下特点:

  • 唯一性:集合中的元素都是唯一的,不会重复
  • 无序性:集合中的元素没有固定的顺序
  • 可变性:可以添加或删除元素
  • 异构性:可以包含不同类型的不可变数据

使用场景

  • 去重:快速删除重复元素
  • 成员检测:高效的元素查找
  • 数学运算:交集、并集、差集等集合运算
  • 数据过滤:筛选符合条件的元素

创建集合

创建集合的多种方式


# 使用花括号创建
numbers = {1, 2, 3, 4, 5}
mixed = {1, "hello", 3.14, True}

# 使用set()函数创建
empty_set = set()  # 创建空集合
list_to_set = set([1, 2, 2, 3, 3, 4])  # 从列表创建
string_to_set = set("hello")  # 从字符串创建

# 集合自动去重
duplicates = {1, 2, 2, 3, 3, 3}
print(duplicates)  # 输出: {1, 2, 3}

# 使用集合推导式
squares = {x**2 for x in range(5)}
print(squares)  # 输出: {0, 1, 4, 9, 16}
                    

注意事项

  • 空集合必须使用set()创建,因为{}表示空字典
  • 集合中的元素必须是不可变类型(如数字、字符串、元组)
  • 列表、字典等可变类型不能作为集合元素

集合运算

基本集合运算


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

# 并集
union = set1 | set2  # 或使用 set1.union(set2)
print(f"并集: {union}")  # {1, 2, 3, 4, 5, 6, 7, 8}

# 交集
intersection = set1 & set2  # 或使用 set1.intersection(set2)
print(f"交集: {intersection}")  # {4, 5}

# 差集
difference = set1 - set2  # 或使用 set1.difference(set2)
print(f"差集: {difference}")  # {1, 2, 3}

# 对称差集
symmetric_diff = set1 ^ set2  # 或使用 set1.symmetric_difference(set2)
print(f"对称差集: {symmetric_diff}")  # {1, 2, 3, 6, 7, 8}

# 子集和超集判断
subset = {1, 2}
print(f"是否为子集: {subset <= set1}")  # True
print(f"是否为真子集: {subset < set1}")  # True
print(f"是否为超集: {set1 >= subset}")  # True
                    

常用方法

集合的基本操作


# 创建示例集合
fruits = {"apple", "banana", "orange"}

# 添加元素
fruits.add("grape")
print(fruits)  # 添加单个元素

fruits.update(["kiwi", "mango"])
print(fruits)  # 添加多个元素

# 删除元素
fruits.remove("apple")  # 元素不存在会报错
fruits.discard("pear")  # 元素不存在不会报错
popped = fruits.pop()   # 随机移除一个元素
fruits.clear()         # 清空集合

# 复制集合
fruits = {"apple", "banana", "orange"}
fruits_copy = fruits.copy()

# 成员检测
print("apple" in fruits)  # True
print("pear" not in fruits)  # True

# 遍历集合
for fruit in fruits:
    print(fruit)
                    

实际应用

数据去重


# 列表去重
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_numbers = list(set(numbers))
print(f"去重后: {unique_numbers}")

# 字符串去重
text = "hello world"
unique_chars = "".join(sorted(set(text)))
print(f"唯一字符: {unique_chars}")

# 保持原顺序去重
def remove_duplicates(items):
    seen = set()
    return [x for x in items if not (x in seen or seen.add(x))]

original = [1, 3, 2, 3, 1, 4, 2]
result = remove_duplicates(original)
print(f"保序去重: {result}")
                    

共同元素查找


# 查找多个列表的共同元素
def find_common_elements(*lists):
    """查找多个列表中的共同元素"""
    if not lists:
        return set()
    # 将所有列表转换为集合并求交集
    sets = [set(lst) for lst in lists]
    return sets[0].intersection(*sets[1:])

# 使用示例
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
list3 = [3, 4, 5, 9, 10]

common = find_common_elements(list1, list2, list3)
print(f"共同元素: {common}")  # {4, 5}
                    

高级特性

不可变集合(frozenset)


# 创建不可变集合
frozen = frozenset([1, 2, 3])

# 可以作为字典的键或其他集合的元素
sets = {frozen, frozenset([4, 5, 6])}
dict_with_sets = {frozen: "不可变集合"}

# 支持所有不修改集合的操作
print(frozen & {2, 3, 4})  # 交集操作
print(frozen | {4, 5, 6})  # 并集操作

# 不支持修改操作
# frozen.add(4)  # 这会报错
                    

集合的性能优化


# 使用集合优化查找性能
def find_duplicates(numbers):
    """查找列表中的重复元素"""
    seen = set()
    duplicates = set()
    
    for num in numbers:
        if num in seen:
            duplicates.add(num)
        else:
            seen.add(num)
    
    return duplicates

# 性能测试
import time
numbers = list(range(1000)) + list(range(500))

start = time.time()
duplicates = find_duplicates(numbers)
end = time.time()

print(f"重复元素: {duplicates}")
print(f"耗时: {(end - start)*1000:.2f}ms")