Python技术迷

在Python中如何定义集合,集合与列表有何区别

今天来聊一聊Python中集合(set)的定义以及它和列表(list)的区别。这个话题看似简单,但深入了解之后,你会发现其实有不少细节值得琢磨。不信?咱们一起来看看!

集合是什么?

首先,咱们得了解一下集合(set)到底是什么。简单来说,集合就是一种无序、不重复的元素集合。在Python中,集合的数据结构可以用来存储多个元素,但这些元素不能重复,且没有特定的顺序。这和我们常见的列表(list)有很大的不同,接下来我会详细说。

如何定义一个集合?

在Python中,定义一个集合非常简单。只需要使用大括号 {} 来包裹元素,元素之间用逗号 , 隔开。例如:

my_set = {1, 2, 3, 4, 5}
print(my_set)

这段代码定义了一个包含5个元素的集合。运行结果会显示:

{1, 2, 3, 4, 5}

注意,集合中的元素是无序的。你可能会觉得,这跟你定义列表的时候,元素的位置是固定的有点不一样,对吧?稍等,咱们接着讲。

集合的特点

  1. 无序:集合中的元素没有顺序,可以理解为“你放进去的顺序,出来时未必还和原来一样”。
  2. 不重复:集合不允许有重复元素。如果你添加了重复元素,Python会自动去重。例如:
my_set = {1, 2, 3, 3, 4}
print(my_set)

输出结果是:

{1, 2, 3, 4}

看,重复的 3 被自动去掉了。非常简单直观。

  1. 可变:集合是可变的,你可以随时添加或者删除元素。例如:
my_set.add(6)  # 添加元素6
my_set.remove(2)  # 删除元素2
print(my_set)

输出结果是:

{1, 3, 4, 6}

不过,集合有一个小小的限制——集合中的元素必须是可哈希的。这意味着,你不能将像列表、字典这样的可变类型作为集合的元素。例如,下面的代码会报错:

my_set = {1, 2, [3, 4]}  # 错误,列表是不可哈希的

集合与列表的区别

接下来,我想和大家聊聊集合和列表的几个关键区别,别看它们好像都能存储元素,背后可是有天壤之别。

1. 有序性

这一点可能是最显著的区别。列表是有序的,而集合是无序的。举个例子,列表是按照你添加的顺序来存储元素的,而集合则没有顺序。来看一下这两者的区别:

my_list = [1, 2, 3, 3, 4]
my_set = {1, 2, 3, 3, 4}

print(my_list)  # 输出: [1, 2, 3, 3, 4]
print(my_set)  # 输出: {1, 2, 3, 4}

你看,列表允许重复,而集合不允许重复,并且集合的元素没有顺序。

2. 重复元素

列表可以包含重复元素,而集合不能。比如,下面这段代码:

my_list = [1, 2, 2, 3, 4, 4]
my_set = {1, 2, 2, 3, 4, 4}

print(my_list)  # 输出: [1, 2, 2, 3, 4, 4]
print(my_set)  # 输出: {1, 2, 3, 4}

列表保留了重复的 2 和 4,而集合自动去掉了这些重复元素。

3. 用途上的差异

  • 列表主要用于需要保留顺序、允许重复数据的场景。例如,你可以用列表来存储用户输入的数据、任务的顺序等。
  • 集合则适用于需要去重、对元素顺序不敏感的场景。比如,去重处理、判断一个元素是否在集合中等。集合的查找速度通常比列表要快得多。

4. 性能差异

如果你频繁进行元素查找操作,集合的性能比列表要好。为什么呢?因为集合是通过哈希表(hash table)实现的,它的查找、插入、删除等操作时间复杂度是O(1),而列表则是O(n)。看看这两个操作的性能差异:

# 使用列表查找元素
import time

my_list = [i for i in range(1000000)]
start_time = time.time()
100 in my_list  # 查找数字100是否在列表中
print("列表查找时间:", time.time() - start_time)

# 使用集合查找元素
my_set = {i for i in range(1000000)}
start_time = time.time()
100 in my_set  # 查找数字100是否在集合中
print("集合查找时间:", time.time() - start_time)

对于列表查找,Python需要逐个元素地扫描,这样的时间复杂度就是O(n)。而集合利用哈希表的性质,直接通过哈希值查找,时间复杂度是O(1),效率要高得多。

5. 常用操作

集合和列表虽然各有特点,但也有一些操作是相似的。比如,检查一个元素是否存在:

# 检查元素是否存在
my_list = [1, 2, 3]
my_set = {1, 2, 3}

print(2 in my_list)  # 输出: True
print(2 in my_set)  # 输出: True

不过,集合还支持一些特殊的操作,比如集合运算,比如并集、交集、差集等,这在列表中是无法直接实现的。

# 集合运算示例
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}

print(set_a | set_b)  # 并集: {1, 2, 3, 4, 5, 6}
print(set_a & set_b)  # 交集: {3, 4}
print(set_a - set_b)  # 差集: {1, 2}

这种集合操作在处理数学或数据分析时特别有用。

总结

看完这些,你应该对集合和列表有了更清晰的认识。集合和列表,虽然都能存储多个元素,但它们的特性和用途完全不同。集合的无序性和不重复性,使它成为处理去重和快速查找的利器;而列表则适用于需要顺序和重复元素的场景。

在实际开发中,我们应该根据场景来选择使用集合还是列表。如果你要处理大量数据,且要求去重并频繁查找,集合无疑是更好的选择。如果你需要保持元素的顺序,并且元素可能会重复,列表则更合适。

在这两者之间切换,记得思考你的需求和性能,选择最适合的工具。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。