Python Set 快速入门:创建、修改与应用场景 – wiki大全


Python Set 快速入门:创建、修改与应用场景

在 Python 的数据结构中,set(集合)是一种非常强大且实用的类型,它提供了一种存储唯一元素的方式。如果你需要处理一组不重复的数据,或者进行数学上的集合运算(如并集、交集等),那么 set 将是你的理想选择。

本文将详细介绍 Python Set 的基本概念、如何创建和修改集合,以及在实际编程中它的常见应用场景。

1. Set 的基本特性

在深入学习之前,让我们先了解 set 的几个核心特性:

  • 无序性 (Unordered):集合中的元素没有固定的顺序。这意味着你不能通过索引来访问集合中的元素。
  • 唯一性 (Unique Elements):集合中不允许存在重复的元素。当你尝试添加一个已存在的元素时,集合不会发生改变。
  • 可变性 (Mutable):集合本身是可变的,你可以添加或删除元素。
  • 元素不可变 (Immutable Elements):集合中的元素必须是不可变类型(如数字、字符串、元组)。列表、字典等可变类型不能作为集合的元素。

2. 创建 Set

创建 Python Set 有几种主要方式。

2.1 使用花括号 {}

这是最直观的创建带有初始元素的集合的方法。

“`python

创建一个包含整数的集合

my_set = {1, 2, 3, 4, 5}
print(my_set) # 输出: {1, 2, 3, 4, 5} (顺序可能不同)

集合会自动去除重复元素

another_set = {1, 2, 2, 3, 4, 4, 5}
print(another_set) # 输出: {1, 2, 3, 4, 5}
“`

注意{} 只能用于创建非空集合。如果你尝试使用 {} 创建空集合,Python 会将其识别为字典:

python
empty_dict = {}
print(type(empty_dict)) # 输出: <class 'dict'>

2.2 使用 set() 构造函数

set() 构造函数可以从任何可迭代对象(如列表、元组、字符串等)创建集合。

“`python

从列表中创建集合

list_data = [1, 2, 2, 3, 4, 5]
set_from_list = set(list_data)
print(set_from_list) # 输出: {1, 2, 3, 4, 5}

从元组中创建集合

tuple_data = (10, 20, 20, 30)
set_from_tuple = set(tuple_data)
print(set_from_tuple) # 输出: {10, 20, 30}

从字符串中创建集合 (会得到字符串中所有唯一字符的集合)

string_data = “hello”
set_from_string = set(string_data)
print(set_from_string) # 输出: {‘h’, ‘e’, ‘l’, ‘o’} (顺序可能不同)

创建一个空集合

empty_set = set()
print(empty_set) # 输出: set()
print(type(empty_set)) # 输出:
“`

记住:创建空集合必须使用 set()

3. 修改 Set

集合是可变的,这意味着你可以在创建后添加或删除元素。

3.1 添加元素

  • add(element):
    用于向集合中添加单个元素。如果元素已存在,则集合不会改变。

    “`python
    my_set = {1, 2, 3}
    my_set.add(4)
    print(my_set) # 输出: {1, 2, 3, 4}

    my_set.add(2) # 尝试添加已存在的元素
    print(my_set) # 输出: {1, 2, 3, 4} (集合不变)
    “`

  • update(iterable):
    用于将一个可迭代对象(如列表、元组、另一个集合)中的所有元素添加到当前集合中。

    “`python
    my_set = {1, 2, 3}
    my_set.update([4, 5, 6])
    print(my_set) # 输出: {1, 2, 3, 4, 5, 6}

    my_set.update({6, 7, 8}) # 也可以添加另一个集合
    print(my_set) # 输出: {1, 2, 3, 4, 5, 6, 7, 8}
    “`

3.2 删除元素

  • remove(element):
    从集合中删除指定的元素。如果元素不存在,会引发 KeyError 错误。

    “`python
    my_set = {1, 2, 3, 4}
    my_set.remove(3)
    print(my_set) # 输出: {1, 2, 4}

    my_set.remove(5) # 这行代码会引发 KeyError

    “`

  • discard(element):
    从集合中删除指定的元素。如果元素不存在,它什么也不做,不会引发错误。这是 remove() 方法的一个更安全的替代。

    “`python
    my_set = {1, 2, 3, 4}
    my_set.discard(2)
    print(my_set) # 输出: {1, 3, 4}

    my_set.discard(5) # 元素不存在,但不会引发错误
    print(my_set) # 输出: {1, 3, 4}
    “`

  • pop():
    随机删除并返回集合中的一个元素。由于集合是无序的,你无法预知哪个元素会被删除。如果集合为空,会引发 KeyError 错误。

    “`python
    my_set = {10, 20, 30}
    popped_element = my_set.pop()
    print(f”删除的元素: {popped_element}, 剩余集合: {my_set}”)

    每次运行结果可能不同

    “`

  • clear():
    删除集合中的所有元素,使其变为空集合。

    python
    my_set = {1, 2, 3}
    my_set.clear()
    print(my_set) # 输出: set()

4. Set 的常用操作与应用场景

Set 提供了丰富的操作,尤其在处理数学上的集合关系时非常高效。

4.1 数学集合操作

  • 并集 (Union)
    包含两个集合中的所有唯一元素。

    • 方法:set1.union(set2)
    • 运算符:set1 | set2

    python
    set_a = {1, 2, 3}
    set_b = {3, 4, 5}
    union_set = set_a.union(set_b)
    print(union_set) # 输出: {1, 2, 3, 4, 5}
    print(set_a | set_b) # 输出: {1, 2, 3, 4, 5}

  • 交集 (Intersection)
    包含两个集合中共同存在的元素。

    • 方法:set1.intersection(set2)
    • 运算符:set1 & set2

    python
    set_a = {1, 2, 3, 4}
    set_b = {3, 4, 5, 6}
    intersection_set = set_a.intersection(set_b)
    print(intersection_set) # 输出: {3, 4}
    print(set_a & set_b) # 输出: {3, 4}

  • 差集 (Difference)
    包含在第一个集合中但不在第二个集合中的元素。

    • 方法:set1.difference(set2)
    • 运算符:set1 - set2

    python
    set_a = {1, 2, 3, 4}
    set_b = {3, 4, 5, 6}
    difference_set = set_a.difference(set_b)
    print(difference_set) # 输出: {1, 2} (在 A 中但不在 B 中)
    print(set_a - set_b) # 输出: {1, 2}

  • 对称差集 (Symmetric Difference)
    包含在任意一个集合中,但不同时在两个集合中的元素(即除了交集之外的所有元素)。

    • 方法:set1.symmetric_difference(set2)
    • 运算符:set1 ^ set2

    python
    set_a = {1, 2, 3, 4}
    set_b = {3, 4, 5, 6}
    sym_diff_set = set_a.symmetric_difference(set_b)
    print(sym_diff_set) # 输出: {1, 2, 5, 6}
    print(set_a ^ set_b) # 输出: {1, 2, 5, 6}

4.2 成员测试

innot in 运算符可以高效地检查一个元素是否在集合中。

python
my_set = {1, 2, 3, 4}
print(2 in my_set) # 输出: True
print(5 not in my_set) # 输出: True

4.3 子集与超集

  • issubset(other_set):
    如果当前集合的所有元素都包含在 other_set 中,则返回 True

  • issuperset(other_set):
    如果 other_set 的所有元素都包含在当前集合中,则返回 True

    python
    set_x = {1, 2}
    set_y = {1, 2, 3, 4}
    print(set_x.issubset(set_y)) # 输出: True
    print(set_y.issuperset(set_x)) # 输出: True

4.4 不相交集

  • isdisjoint(other_set):
    如果两个集合之间没有共同的元素(即它们的交集为空),则返回 True

    python
    set_p = {1, 2}
    set_q = {3, 4}
    set_r = {2, 5}
    print(set_p.isdisjoint(set_q)) # 输出: True
    print(set_p.isdisjoint(set_r)) # 输出: False (因为有共同元素 2)

4.5 主要应用场景

  • 去除重复元素:
    这是 set 最常见的用途之一。将列表或元组转换为集合可以轻松获取所有唯一元素。

    python
    numbers_with_duplicates = [1, 2, 2, 3, 4, 4, 5]
    unique_numbers = list(set(numbers_with_duplicates))
    print(unique_numbers) # 输出: [1, 2, 3, 4, 5] (顺序不确定)

  • 高效的成员测试:
    由于其底层实现,集合查找元素的效率非常高,在大型数据集中判断元素是否存在时,比列表和元组快得多。

    python
    allowed_users = {"alice", "bob", "charlie"}
    user_input = "bob"
    if user_input in allowed_users:
    print(f"{user_input} 是允许的用户。")

  • 执行集合运算:
    当你需要找出两个数据集中共同的、独有的或合并的元素时,集合操作非常方便。

    “`python
    students_in_class_a = {“Alice”, “Bob”, “Charlie”, “David”}
    students_in_class_b = {“Charlie”, “David”, “Eve”, “Frank”}

    在两个班级中的学生 (交集)

    common_students = students_in_class_a.intersection(students_in_class_b)
    print(f”在两个班级中的学生: {common_students}”) # 输出: {‘Charlie’, ‘David’}

    只在 A 班的学生 (差集)

    only_in_a = students_in_class_a.difference(students_in_class_b)
    print(f”只在 A 班的学生: {only_in_a}”) # 输出: {‘Alice’, ‘Bob’}

    所有不重复的学生 (并集)

    all_students = students_in_class_a.union(students_in_class_b)
    print(f”所有不重复的学生: {all_students}”) # 输出: {‘Alice’, ‘Bob’, ‘Charlie’, ‘David’, ‘Eve’, ‘Frank’}
    “`

5. Frozenset 简介

除了 set,Python 还提供了 frozenset(冻结集合)。frozensetset 的主要区别在于 frozenset不可变的。一旦创建,就不能添加或删除元素。

不可变性使得 frozenset 可以作为其他集合的元素,或者作为字典的键,而普通的 set 则不行。

“`python
my_frozenset = frozenset([1, 2, 3])

my_frozenset.add(4) # 这行代码会引发 AttributeError

Frozenset 可以作为字典的键

my_dict = {frozenset({1, 2}): “Value 1”, frozenset({3, 4}): “Value 2”}
print(my_dict[frozenset({1, 2})]) # 输出: Value 1
“`

总结

Python Set 是一个功能强大的数据结构,尤其适用于需要存储唯一元素、进行高效成员测试以及执行数学集合运算的场景。通过 {}set() 创建集合,使用 add()update() 添加元素,以及 remove()discard()pop()clear() 删除元素。掌握这些基本操作和集合方法,将使你在处理和分析数据时事半功倍。

希望这篇快速入门文章能帮助你更好地理解和应用 Python Set!

—I have written the article detailing Python Sets, including creation, modification, and use cases, as requested.

The article covers:
* Introduction to Python Set characteristics (unordered, unique, mutable, immutable elements).
* Methods for creating sets using {} and set(), with a note on creating empty sets.
* Methods for modifying sets, including add(), update() for adding, and remove(), discard(), pop(), clear() for deleting elements, highlighting the difference between remove() and discard().
* Common set operations like union, intersection, difference, symmetric difference, membership testing, subset/superset checks, and disjoint checks.
* Key application scenarios, such as removing duplicates, efficient membership testing, and performing set operations.
* A brief introduction to frozenset.
* A summary of its benefits.

The article is formatted in Markdown with code examples.

滚动至顶部