Python3萌新入门笔记(39)

这一篇教程,我们继续了解一些内置模块。

四、glob模块

在上一篇教程中,我们通过os模块获取文件夹中的所有文件名,然后组织成多个文件的路径列表,通过fileinput模块进行遍历。

这样的操作比较麻烦。

实际上,我们可以使用glob模块中的函数帮我们简便的实现这个需求。

glob模块支持通配符“*”、“?”、和“[]”,“*”表示0个或多个字符,“?”表示一个字符,“[]”表示匹配指定范围内的字符,例如“[0-9]”匹配数字0-9。

另外,glob模块还支持通配符“**”,能够获取一个目录下所有的目录以及目录中的文件。

glob模块的内容很少,包括3个函数。

  • glob(pathname, recursive=False):获取所有匹配路径的列表。参数pathname为需要匹配的路径字符串;参数recursive为递归,调用递归时(值为True),需配合通配符“**”使用,默认为False(不调用递归)。
  • iglob(pathname, recursive=False):获取所有匹配路径的生成器,参数同上。
  • escape(pathname):忽略所有通配符。

接下来,我们通过glob模块,简化之前的示例代码。

示例代码:

import fileinput,glob

path = r'C:\Users\Administrator\Desktop\song\*.txt'  # 设置查询的目标文件夹路径的所有txt文件
files = fileinput.input(glob.glob(path))  # 获取目标文件夹中所有文件
for line in files:
    (以下代码省略)

五、heapq模块

heap(堆)是一种数据结构。

普通的队列是顺序排列。

例如:列表[3,2,5,7,1,9,8,6,0,4]进行由小到大的排列就是[0,1,2,3,4,5,6,7,8,9]。

如果我们把这个列表转为带有堆属性的列表(以下简称:堆列表),结果是:[0,1,5,2,3,9,8,6,7,4]

这个堆列表看上去是无序的,实际上是按优先级进行排列。

所以,堆的排列是有规则的排列。

那么,堆的排列规则是怎样的呢?

首先,我们要了解堆的结构,堆是完全二叉树的结构。

列表[3,2,5,7,1,9,8,6,0,4]转换为堆列表时,初始结构如下图:

这个结构从上至下,从左至右的获取元素,就是列表中的顺序。

图中的结构,就像倒过来的树(我看更像树根),每一个节点最多有两个分支,所以是完全二叉树的结构。

如果不把这个结构看成树,它也像将多个元素堆在了一起,所以它叫堆。

概念搞清楚,就不会那么迷茫了。

接下来,我们看它是按什么规则重新排序的。

我们堆东西的时候,假设每个物品都有承重上限,为了不把物品压破,我们需要把承重能力小的摆放在上方。

假设列表中的元素数值就是每个元素的承重上限,在已有结构上怎么调整才不会有物品被压破呢?

我们可以按照从下往上,从左往右的顺序进行调整。

每个上层物品和它下层的两个物品比较承重上限,取承重上限最小的放在上层。

也就是说,如果承重最小的物品在下层的话,就和上层的物品位置互换。

那么,在刚才堆的基础之上,我们进行调整,过程如下:

注意,由下至上完成一次调整之后,可能还会存在不符合要求的排列(图中第4步),还要从有问题的位置由下至上继续调整,直到所有排列都符合要求为止。

通过这个调整过程,我们就能够看出堆的排列规则。

这种排列规则可以表示为:heap[index] <= heap[2*index+1] and heap[index] <= heap[2*index+2]

也就是每一个父节点的数值小于等于两个子节点的数值。

因为,堆的这种优先规则,在获取一个列表的最小值时(可以增加元素的同时找到最小元素),要比列表的min()函数更加快捷。

Python中没有独立的堆类型,只是在内置模块heapq中提供了一些操作堆的函数。

heapify(list):将列表转换堆列表。

heappush(heap,item):执行将元素入堆的操作,heap为已有堆列表,item为新的入堆元素。

heappop(heap):取出堆中最小元素。

heapreplace(heap,item):替换堆列表中最小的元素为新元素。

heappushpop(heap,item):新元素入堆,然后取出堆列表中最小的元素。

nlargest(n, iterable, key=None):获取最大的n个元素。

nsmallest(n, iterable, key=None):获取最小的n个元素。

merge(*iterables):将多个列表合并,并进行堆调整,返回的是合并后的列表的迭代器。

接下来,通过示例代码演示上方函数的使用方法。

示例代码:

import heapq  # 导入需要使用的模块

heap = [3, 2, 5, 7, 1, 9, 8, 6, 0, 4]
heapq.heapify(heap)  # 列表转换为堆列表
print(heap)  # 显示输出结果为:[0, 1, 5, 2, 3, 9, 8, 6, 7, 4]
heapq.heappush(heap, 0.5)  # 新元素入堆
print(heap)  # 显示输出结果为:[0, 0.5, 5, 2, 1, 9, 8, 6, 7, 4, 3]
print(heapq.heappop(heap))  # 取出堆列表中最小的元素,显示输出结果为:0
print(heap)  # 显示输出结果为:[0.5, 1, 5, 2, 3, 9, 8, 6, 7, 4]
heapq.heapreplace(heap, 10)  # 替换堆列表中最小的元素为新元素
print(heap)  # 显示输出结果为:[1, 2, 5, 6, 3, 9, 8, 10, 7, 4]
print(heapq.heappushpop(heap, 11))  # 新元素入堆,然后取出堆列表中最小的元素,显示输出结果为:1
print(heap)  # 显示输出结果为:[2, 3, 5, 6, 4, 9, 8, 10, 7, 11]
print(heapq.nlargest(5, heap))  # 显示输出结果为:[11, 10, 9, 8, 7]
print(heapq.nsmallest(5, heap))  # 显示输出结果为:[2, 3, 4, 5, 6]
print(list(heapq.merge([1, 4, 7], [0, 2, 5])))  # 显示输出结果为:[0, 1, 2, 4, 5, 7]

本节知识点:

1、glob模块

2、堆的结构

3、heapq模块

本节英文单词与中文释义:

1、glob:一团

2、recursive:递归

3、escape:规避

4、heap:堆

5、heapq(heap queue):堆队列

6、ify:动词后缀,表示使……化

7、push:增加

8、largest:最大的

9、smallest:最小的

10、merge:合并

转载自:魔力 • Python » Python3萌新入门笔记(39)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Python入门笔记,我可以提供一些基本的知识点: 1. 在Python中,数字和字符串不能直接进行加法运算,只能是字符串和字符串的拼接。 2. 在编写Python程序时,如果在字符串中使用单引号,需要注意使用成对出现的单引号。如果使用单个单引号,可能会导致解析器报错。 3. 在Python中,逻辑运算符&#39;and&#39;和&#39;or&#39;不一定会计算右侧表达式的值。有时只需计算左侧表达式即可得出结果。这是因为&#39;and&#39;和&#39;or&#39;会将其中一个表达式的值作为最终结果,而不仅仅是True或False。 4. Python的流程控制中,顺序结构是最基本的结构,按照代码的编写顺序依次执行。 这些是Python入门笔记中的一些要点,希望对你有所帮助。如果你有其他问题,欢迎继续提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python入门课程笔记](https://blog.csdn.net/YV_LING/article/details/123413336)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python入门学习笔记](https://blog.csdn.net/Lalalalazy/article/details/113181549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值