pin_drop当前位置:知识文库 ❯ 图文
Python集合创建与访问
一、概述
集合(set)是Python中一种重要的内置数据结构,它是一个无序的、不重复的元素集合。集合的数学基础来源于数学中的集合论,Python中的集合完美地支持了交集、并集、差集等数学运算。理解集合的创建方式和基本特性,是掌握集合操作的第一步。
二、多种创建方式
字面量创建
使用花括号 {} 包裹元素,元素之间用逗号分隔,这是最直观的创建方式:
代码示例
fruits = {"apple", "banana", "cherry"}
print(fruits)
print(type(fruits))输出:
代码示例
{'cherry', 'apple', 'banana'}
<class 'set'>set() 函数创建
使用 set() 内置函数可以从任何可迭代对象创建集合:
代码示例
empty_set = set()
print(empty_set)
print(type(empty_set))
from_list = set([1, 2, 3, 4])
print(from_list)
from_string = set("hello")
print(from_string)
from_tuple = set((10, 20, 30))
print(from_tuple)输出:
代码示例
set()
<class 'set'>
{1, 2, 3, 4}
{'h', 'e', 'l', 'o'}
{10, 20, 30}注意:创建空集合必须使用
set(),不能使用{},因为{}创建的是空字典,不是空集合。
代码示例
empty_dict = {}
print(type(empty_dict))
empty_set = set()
print(type(empty_set))输出:
代码示例
<class 'dict'>
<class 'set'>三、集合无序性
集合中的元素没有固定的顺序,每次输出的结果可能不同:
代码示例
colors = {"red", "green", "blue", "yellow"}
print(colors)输出可能为:
代码示例
{'yellow', 'blue', 'green', 'red'}由于无序性,集合不支持索引访问和切片操作:
代码示例
colors = {"red", "green", "blue"}
# 以下操作会报错
# print(colors[0]) # TypeError: 'set' object is not subscriptable
# print(colors[1:3]) # TypeError: 'set' object is not subscriptable
如果需要按顺序访问集合元素,可以先将集合转换为列表或使用 sorted() 函数:
代码示例
colors = {"red", "green", "blue"}
color_list = sorted(colors)
print(color_list)
print(color_list[0])输出:
代码示例
['blue', 'green', 'red']
blue四、元素唯一性
集合中的元素是唯一的,重复的元素会自动被去除。这一特性使得集合常被用于去重操作:
代码示例
numbers = {1, 2, 3, 2, 4, 3, 5, 1}
print(numbers)输出:
代码示例
{1, 2, 3, 4, 5}利用集合去重的典型场景——列表去重:
代码示例
data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
unique_data = list(set(data))
print(unique_data)输出:
代码示例
[1, 2, 3, 4, 5, 6, 9]注意:使用
set()去重会丢失原始顺序。如果需要保持顺序,可以使用字典的方式去重:
代码示例
data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
unique_data = list(dict.fromkeys(data))
print(unique_data)输出:
代码示例
[3, 1, 4, 5, 9, 2, 6]五、集合与列表/字典对比
提示:集合的查找效率为 O(1),远高于列表的 O(n)。当需要频繁判断元素是否存在时,优先使用集合。
六、代码示例
综合示例:利用集合进行数据分析
代码示例
students_math = {"张三", "李四", "王五", "赵六"}
students_english = {"李四", "王五", "钱七", "孙八"}
both = students_math & students_english
print(f"两门课都选的学生: {both}")
all_students = students_math | students_english
print(f"所有选课学生: {all_students}")
only_math = students_math - students_english
print(f"只选数学的学生: {only_math}")
print(f"数学课人数: {len(students_math)}")
print(f"英语课人数: {len(students_english)}")
print(f"总人数: {len(all_students)}")输出:
代码示例
两门课都选的学生: {'王五', '李四'}
所有选课学生: {'赵六', '钱七', '张三', '孙八', '王五', '李四'}
只选数学的学生: {'赵六', '张三'}
数学课人数: 4
英语课人数: 4
总人数: 6集合的遍历
代码示例
fruits = {"apple", "banana", "cherry"}
for fruit in fruits:
print(fruit)输出(顺序可能不同):
代码示例
cherry
apple
banana判断元素是否在集合中
代码示例
fruits = {"apple", "banana", "cherry"}
print("apple" in fruits)
print("grape" in fruits)
print("grape" not in fruits)输出:
代码示例
True
False
True七、注意事项
-
空集合必须用 set() 创建:
{}创建的是空字典,不是空集合。 -
集合元素必须是可哈希类型:列表、字典、集合等不可变对象不能作为集合元素,但元组可以。
-
集合无序:不要依赖集合的输出顺序,每次运行可能不同。
-
集合不支持索引:不能通过下标访问或切片。
-
字面量创建的陷阱:
{1, 2, 3}是集合,但{}是字典,注意区分。
八、小结
本节介绍了集合的两种创建方式——字面量 {} 和 set() 函数,强调了空集合只能用 set() 创建。集合的核心特性是无序性和元素唯一性,这决定了集合不支持索引访问,但天然具备去重能力。通过对比表格,我们清晰地看到了集合与列表、字典的区别,集合在查找效率上具有显著优势。
九、练习题
练习1
给定一个包含重复元素的列表 [5, 3, 8, 3, 1, 5, 9, 8, 2],请使用集合去重后输出不重复的元素,并统计不重复元素的个数。
练习2
请判断以下代码的输出结果,并解释原因:
代码示例
a = {}
b = set()
print(type(a))
print(type(b))
print(len(a))
print(len(b))常见问题
为什么创建空集合必须用 set() 而不能用 {}?
因为在Python中,{} 已经被用于创建空字典。为了区分空集合和空字典,创建空集合必须使用 set() 函数。
集合和列表、字典的主要区别是什么?
集合是无序且不重复的,不支持索引访问,但查找效率为 O(1);列表是有序可重复的,支持索引;字典是键值对结构,键唯一值可重复。
集合去重后会保持原来的顺序吗?
不会。集合是无序的,去重后不会保持原始顺序。如果需要保持顺序去重,可以使用 dict.fromkeys() 方法。
小贴士
Python 的集合底层使用哈希表实现,这使得集合的查找、插入和删除操作的时间复杂度都是 O(1)。当需要频繁判断元素是否存在时,集合是最佳选择。集合的数学基础来源于集合论,支持交集、并集、差集等丰富的数学运算。
本文涉及AI创作
内容由AI创作,请仔细甄别