ZetCode

Python set 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 set 函数,该函数创建一个包含唯一元素的无序集合。我们将介绍集合的创建、操作和实际示例。

基本定义

set 函数创建一个包含唯一且可哈希元素的 mutable set 对象。集合是无序的集合,不允许重复元素。

主要特点:元素必须是可哈希的,集合是可变的,但元素必须是不可变的,支持数学集合运算,如并集和交集。

创建基本集合

以下是简单的用法,展示了如何使用 set 构造函数从不同的可迭代类型创建集合。

basic_set.py
# From a list
numbers = set([1, 2, 3, 2, 1])
print(numbers)  # {1, 2, 3}

# From a string
chars = set("hello")
print(chars)    # {'h', 'e', 'l', 'o'}

# From a tuple
items = set(('apple', 'banana', 'apple'))
print(items)    # {'apple', 'banana'}

# Empty set
empty = set()
print(empty)    # set()

此示例展示了从不同可迭代对象创建集合。重复项会自动删除。 请注意,空集合的语法与字典不同。

字符串示例显示集合如何将序列分解为单个元素。 请注意输出中由于唯一性而只有一个“l”。

集合操作

集合支持强大的数学运算。 此示例演示了常见的集合运算,如并集、交集和差集。

operations.py
a = set([1, 2, 3, 4])
b = set([3, 4, 5, 6])

# Union
print(a | b)        # {1, 2, 3, 4, 5, 6}
print(a.union(b))   # same as above

# Intersection
print(a & b)        # {3, 4}
print(a.intersection(b))

# Difference
print(a - b)        # {1, 2}
print(a.difference(b))

# Symmetric difference
print(a ^ b)        # {1, 2, 5, 6}
print(a.symmetric_difference(b))

这演示了四个基本集合运算。 每个操作都有运算符和方法版本。 对称差显示存在于任一集合中但不同时存在于两个集合中的元素。

这些操作经过高度优化,比使用列表的手动实现快得多。

集合推导式

与列表推导式类似,Python 支持集合推导式,以便简洁地创建集合。 此示例显示了各种集合推导式。

comprehensions.py
# Basic comprehension
squares = {x**2 for x in range(10)}
print(squares)  # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

# With condition
odds = {x for x in range(20) if x % 2 != 0}
print(odds)     # {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}

# From another iterable
words = ["hello", "world", "python"]
lengths = {len(word) for word in words}
print(lengths)  # {5, 6}

集合推导式遵循与列表推导式相同的语法,但使用大括号。 它们会自动处理唯一性,就像常规集合一样。

第二个示例过滤奇数。 第三个示例显示了转换,演示了集合自动删除长度重复项。

成员资格测试

由于哈希表实现,集合提供非常快的成员资格测试。 此示例比较了集合和列表的性能。

membership.py
import timeit

# Large collections
big_set = set(range(1000000))
big_list = list(range(1000000))

# Membership test functions
def test_set():
    return 999999 in big_set

def test_list():
    return 999999 in big_list

# Timing
print("Set membership:", timeit.timeit(test_set, number=10000))
print("List membership:", timeit.timeit(test_list, number=10000))

此基准测试显示了成员资格测试的显着性能差异。 集合使用 O(1) 查找,而列表使用 O(n) 线性搜索。

对于大型集合,集合在成员资格测试方面可能比列表快数千倍。

冻结集合

Python 通过 frozenset 提供不可变集合。 此示例显示了它们的创建和用作字典键。

frozen.py
# Create frozenset
fs = frozenset([1, 2, 3, 4])
print(fs)  # frozenset({1, 2, 3, 4})

# Use as dictionary key
d = {
    frozenset([1, 2]): "set with 1 and 2",
    frozenset([3, 4]): "set with 3 and 4"
}

print(d[frozenset([1, 2])])  # "set with 1 and 2"

冻结集合是可哈希且不可变的,使其适合作为字典键。 常规集合不能以这种方式使用,因为它们是可变的。

除了修改集合的操作之外,所有集合操作都适用于冻结集合。 当您需要在可哈希形式中使用集合属性时,它们很有用。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程