首页 > 编程语言 >第八篇:Python集合:高效的无序集数据结构

第八篇:Python集合:高效的无序集数据结构

时间:2024-07-13 09:27:31浏览次数:11  
标签:set Python 第八篇 元素 列表 print 集合 数据结构 字典

1.集合的定义

Python中的集合(set)是一种高度优化的无序且不重复的数据结构。它在概念上类似于数学中的集合,能够存储多个不同的元素。集合的这种特性使其成为处理唯一性和成员资格检查的理想选择。在Python中,我们可以通过两种主要方式定义集合:

a) 使用花括号{}:
set1 = {1, 2, 3, 4, 5}
​

这种方法直观简洁,但要注意空花括号{}会创建一个字典而不是集合。

b) 使用set()函数:
set2 = set([1, 2, 3, 3, 4, 5])

set()函数可以将其他可迭代对象转换为集合,同时自动去除重复元素。这种方法特别适合从已有数据创建集合或创建空集合。

集合的不重复特性使其成为数据去重的有力工具:

numbers = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique_numbers = set(numbers)  # 结果: {1, 2, 3, 4, 5}

2.集合的键与值

与字典不同,集合只包含键,没有对应的值。在集合中,每个元素本身就是一个独立的值,同时也扮演着键的角色。这种设计使得集合在某些操作上比字典更加高效。

集合对元素类型有严格要求:只有不可变(immutable)的数据类型才能作为集合的元素。这包括:

  • 数字(整数、浮点数、复数)
  • 字符串
  • 元组(仅当元组内所有元素也都是不可变类型时)

例如,以下是合法的集合:

valid_set = {1, 'hello', (1, 2, 3)}

而以下操作会引发异常:

invalid_set = {[1, 2, 3]}  # 列表是可变的,不能作为集合元素

3.集合与列表、元组、字典的比较

a) 与列表和元组的比较:
  • 有序性: 列表和元组是有序的,而集合是无序的。这意味着集合不支持索引和切片操作。
  • 重复性: 列表和元组允许重复元素,而集合自动去除重复。
  • 可变性: 列表是可变的,元组是不可变的,而集合是可变的(但其元素必须是不可变的)。
b) 与字典的比较:
  • 结构: 字典存储键值对,而集合只存储单个元素。
  • 键的要求: 字典的键和集合的元素都必须是不可变的。
  • 用途: 字典用于存储关联数据,而集合主要用于存储唯一元素和进行集合运算。
c) 性能比较:
  • 成员检测: 集合和字典的成员检测(使用in操作符)通常比列表快得多,时间复杂度为O(1)。
  • 添加元素: 向集合添加元素通常比向列表

添加元素更快,特别是当处理大量数据时。

  • 内存使用:对于存储唯一元素,集合通常比列表更节省内存。
示例比较:
import timeit

# 列表查找
list_time = timeit.timeit(stmt='99999 in my_list', setup='my_list = list(range(100000))', number=1000)

# 集合查找
set_time = timeit.timeit(stmt='99999 in my_set', setup='my_set = set(range(100000))', number=1000)

print(f"列表查找时间: {list_time}")
print(f"集合查找时间: {set_time}")

这个简单的性能测试通常会显示集合的查找速度远快于列表。

集合的常见操作

a) 添加元素:

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

s = {1, 2, 3}
s.add(4)  # s现在是 {1, 2, 3, 4}
s.add(2)  # s不变,仍是 {1, 2, 3, 4}

update(iterable): 将一个可迭代对象中的所有元素添加到集合中。

s = {1, 2, 3}
s.update([3, 4, 5])  # s现在是 {1, 2, 3, 4, 5}
b) 删除元素:

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

s = {1, 2, 3}
s.remove(2)  # s现在是 {1, 3}
s.remove(4)  # 引发KeyError

discard(element): 从集合中移除指定元素。如果元素不存在,不会引发错误。

s = {1, 2, 3}
s.discard(2)  # s现在是 {1, 3}
s.discard(4)  # s不变,不会引发错误

pop(): 随机移除并返回集合中的一个元素。如果集合为空,会引发KeyError。

s = {1, 2, 3}
element = s.pop()  # element可能是1、2或3中的任何一个

clear(): 移除集合中的所有元素。

s = {1, 2, 3}
s.clear()  # s现在是空集合 set()
c) 集合运算:

intersection(other_set): 返回两个集合的交集。

a = {1, 2, 3}
b = {3, 4, 5}
print(a.intersection(b))  # 输出: {3}

union(other_set): 返回两个集合的并集。

print(a.union(b))  # 输出: {1, 2, 3, 4, 5}

difference(other_set): 返回在当前集合中但不在另一个集合中的元素。

print(a.difference(b))  # 输出: {1, 2}
d) 其他操作:

len(set): 返回集合中元素的数量。

s = {1, 2, 3}
print(len(s))# 输出3

in 操作符: 检查元素是否在集合中。

s = {1, 2, 3}
print(2 in s)  # 输出: True
print(4 in s)  # 输出: False

issubset(other_set) 和 issuperset(other_set): 检查一个集合是否是另一个的子集或超集。

a = {1, 2}
b = {1, 2, 3, 4}
print(a.issubset(b))  # 输出: True
print(b.issuperset(a))  # 输出: True

集合的高级用法和注意事项

  1. 不可变集合(frozenset):
    Python还提供了不可变的集合类型,称为frozenset。这种类型的集合创建后就不能被修改,可以用作字典的键或其他集合的元素。

    fs = frozenset([1, 2, 3])
    regular_set = {fs, 4, 5}  # 这是合法的
  2. 集合推导式:
    类似于列表推导式,Python也支持集合推导式,这是一种简洁创建集合的方法。

    squares = {x**2 for x in range(10)
  3. 集合的数学运算:
    集合支持多种数学运算,可以使用操作符简化代码:

    交集:&

    并集:|

    差集:-

    对称差集:^

a = {1, 2, 3}
b = {3, 4, 5}
print(a & b)  # 交集,输出: {3}
print(a | b)  # 并集,输出: {1, 2, 3, 4, 5}
print(a - b)  # 差集,输出: {1, 2}
print(a ^ b)  # 对称差集,输出: {1, 2, 4, 5}
性能考虑:

集合的许多操作(如添加、删除、检查成员)的平均时间复杂度为O(1),这使得集合在处理大量数据时非常高效。

但是,集合消耗的内存通常比列表多,因为它需要存储哈希表。

应用场景:

去重:快速删除重复元素

成员资格测试:高效检查元素是否存在

数学集合运算:进行交集、并集、差集等操作

数据筛选:结合其他数据结构快速筛选数据

总结


Python的集合是一个强大而灵活的数据结构,它结合了列表的多元素存储能力和字典的快速查找特性。集合特别适合需要存储唯一元素、快速成员检测以及进行集合运算的场景。通过合理使用集合,可以显著提高某些类型操作的效率,尤其是在处理大量数据时。然而,使用集合时也需要注意其无序性和元素类型的限制。在选择使用集合时,应该根据具体的应用需求和性能要求来权衡。

标签:set,Python,第八篇,元素,列表,print,集合,数据结构,字典
From: https://blog.csdn.net/m0_74252611/article/details/140386472

相关文章

  • 总结篇:Python数据类型总结
    在Python中,数据类型是编程的基础。理解和熟练运用各种数据类型及其操作方法,是编写高效、优雅代码的关键。本文将结合自己的理解,详细介绍Python中的几种基本数据类型及其常用操作。一.整数(Int)整数是最基本的数据类型之一,主要用于表示没有小数部分的数值。常用操作:1.声明整......
  • Python项目开发实战,掷硬币的连胜,案例教程编程实例课程详解
    在Python中进行实战项目,比如模拟掷硬币并记录连胜次数,是一个既有趣又能加深理解随机数生成、循环控制、条件判断等编程基础的好方法。下面,我将逐步引导你完成一个详细的Python项目,该项目将模拟掷硬币的过程,并追踪记录连胜的次数,同时我们会深入探讨一些编程概念,如函数封装、异常......
  • 初学者必看的 3 个 Python 小项目
    我们都知道,将知识点融入实际操作是提高编程学习效率的关键。尤其对于初学者来说,通过学习一些涉及核心编程概念的简单项目,不仅可以深化对编程语言的理解,还能快速提高解决问题的能力。下面将探讨三个基础的Python项目:计算器、猜数字游戏和待办事项列表,旨在巩固Python基础......
  • 教你使用 python 不到100行 制作 音乐播放器
    在这篇博客中,我们将使用Python的PyQt5和pygame库来创建一个简单的音乐播放器应用程序。我们的音乐播放器将具有基本的播放、暂停、上一首和下一首功能。导入所需的库首先,我们需要导入我们将在应用程序中使用的库:importosimportpygameimportqtawesomeasqtafr......
  • python 校验密码强度
    在我们的日常生活中,密码的安全性是非常重要的。无论是我们的电子邮件账户,社交媒体账户,还是银行账户,都需要一个强大的密码来保护。在这篇文章中,我将向你展示如何使用Python来检查密码的强度。代码解析首先,我们需要导入 string 库。importstring然后,我们定义一个函数......
  • 用python处理excel数据
    1.小技巧:用print()检查代码,可以把想检查的变量作为参数放进括号内打印出来,便于检查2.第三方库:1.xlrd读取excel文件。 2.xlwt写入excel文件。 3.xlutils一组excel高级操作的工具3.xlrd包含四个功能:1.读取有效单元格的行数和列数。2.读取指定行或列所有单元格的值。3.读取......
  • 【Python 基础】列表 - 1
    列表在你能够开始编写程序之前,还有一个主题需要理解,那就是列表数据类型及元组。列表和元组可以包含多个值,这样编写程序来处理大量数据就变得更容易。而且,由于列表本身又可以包含其他列表,所以可以用它们将数据安排成层次结构。列表数据类型“列表”是一个值,它包含多个字构......
  • 【python学习】面向对象编程以及面向对象编程的核心概念和使用方法
    引言Python语言设计之初,就是为了面向对象,所以Python的面向对象更加易于理解。面向对象编程中,我们将现实世界的实体视为对象,每个对象都有属性(数据)和行为(方法)文章目录引言一、面向对象编程是什么二、面向过程编程和面向对象编程的区别2.1面对过程编程2.2面向对象编......
  • 【Python123题库】#查询省会 #字典的属性、方法与应用
    禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/140081665参考教程:B站视频讲解——https://space.bilibili.com/3546616042621301有帮助麻烦点个赞~~Python123题库查询省会字典的属性、方法与应用查询省会类型:字典‪‬‪‬‪‬‪‬‪‬‮‬‪‬......
  • 超详细Python教程——迭代器和生成器
    迭代器和生成器迭代器是实现了迭代器协议的对象。Python中没有像protocol或interface这样的定义协议的关键字。Python中用魔术方法表示协议。__iter__和__next__魔术方法就是迭代器协议。classFib(object):"""迭代器"""def__init__(self,num):......