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]

五、集合与列表/字典对比

特性 集合(set) 列表(list) 字典(dict)
定义符号 {}set() []list() {}dict()
有序性 无序 有序 有序(Python 3.7+)
元素唯一 键唯一,值可重复
可变性 可变 可变 可变
索引访问 不支持 支持 通过键访问
元素类型 必须可哈希 任意类型 键必须可哈希,值任意
查找效率 O(1) O(n) O(1)
空对象创建 set() [] {}

提示:集合的查找效率为 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)。当需要频繁判断元素是否存在时,集合是最佳选择。集合的数学基础来源于集合论,支持交集、并集、差集等丰富的数学运算。

标签: Python集合 集合创建 set函数 去重 无序集合 Python基础

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python嵌套字典 下一篇: Python集合add()方法

poll相关推荐