- collections:数据容器 点这里跳到原文地址。
- 预计阅读时长:10分钟+
- 未完待续,遇到相关力扣题目,会继续补充~
文章目录
- 前言
- 一、Collections中的内置函数
- 二、各个函数的使用
- 1. deque
- 1.1 deque的介绍
- 1.2 deque支持的方法
- 1.3 使用deque解决二叉树的层序遍历
- 2. 认识ChainMap
- 3. Counter
- 3.1 使用Counter解决:力扣169. 多数元素
- 3.2 使用Counter解决:力扣136. 只出现一次的数字
- 总结
前言
collections
是Python自带的库函数之一,该模块实现了专门的容器数据类型,为 Python
的通用内置容器、dict、list、set 和 tuple 提供了替代方案。
一、Collections中的内置函数
函数名称 | 函数作用 |
---|---|
namedtuple() | 用于创建具有命名字段的元组子类的工厂函数 |
deque() | 类似列表的容器,两端都可以增加和弹出 |
ChainMap() | 用于创建多个映射的单个视图的类 dict 类 |
Counter() | 用于计算可散列对象的 dict 子类 |
OrderedDict() | 添加了记住订单条目的 dict 子类 |
defaultdict() | 调用工厂函数以提供缺失值的 dict 子类 |
UserDict() | 包装字典对象以便更容易地进行字典子类化 |
UserList() | 包装列表对象以便更轻松地进行列表子类化 |
UserString() | 围绕字符串对象进行包装,以便更轻松地进行字符串子类化 |
二、各个函数的使用
1. deque
1.1 deque的介绍
deque
其实就是双端队列功能的扩展,双端队列支持从双端队列的任一侧进行 追加 和 弹出操作。
1.2 deque支持的方法
deque
对象支持以下方法:
- append(x):将 x 添加到双端队列的右侧
- appendleft(x):将 x 添加到双端队列的左侧
- clear():从双端队列中删除所有元素,使其长度为 0
- copy():创建双端队列的一个副本
- count(x) :计算双端队列中等于 x 的元素的数量
- extend(iterable):通过附加可迭代参数中的元素来扩展双端队列的右侧
- extendleft(iterable):通过附加来自可迭代的元素来扩展双端队列的左侧。注意,一系列左附加会导致可迭代参数中元素的顺序颠倒
- index(x[, start[, stop]]):返回 x 在双端队列中的位置。如果未找到,则返回第一个匹配项或引发 ValueError
- insert(i, x):将 x 插入到位置 i 的双端队列中
- pop():从双端队列的右侧移除并返回一个元素
- popleft():从双端队列的左侧移除并返回一个元素
- remove(value):删除第一次出现的值
- reverse():原地反转双端队列的元素,然后返回无。
- rotate(n=1):向右旋转双端队列 n 步。如果 n 为负数,则向左旋转。
1.3 使用deque解决二叉树的层序遍历
- 题目链接:102. 二叉树的层序遍历
- 题目描述:给你二叉树的根节点 root ,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。
- 解题思路:借助队列,模拟二叉树的层序遍历。第一步先让根节点进入
队列
并记录此时队列
的大小size
(为什么要记录此时队列的大小呢,是因为我们要知道每一层有多少个节点,这样我们才知道我们遍历的是哪一层)。根据size
的大小去操作队列的弹出与追加,具体操作如下图所示:
- python代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
results = [] # 存放最终的结果
if not root:
return results
queue = deque([root])
while queue:
size = len(queue)
result = []
for _ in range(size):
cur = queue.popleft()
result.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
results.append(result)
return results
2. 认识ChainMap
ChainMap(*maps)
3. Counter
Counter
是用于对可散列对象进行计数的dict子类。它是一个集合,其中元素存储为字典键,其计数存储为字典值。计数可以是任何整数值,包括零计数或负计数。Counter类
类似于其他语言中的包或多集。
3.1 使用Counter解决:力扣169. 多数元素
- 题目链接:169. 多数元素
- 题目描述:给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
- 解题思路:利用哈希表统计数组nums中每个元素出现的次数,输出最大的。这里借助collections库中的Counter容器,将nums存储为字典形式,键是nums中的元素,值是该元素所出现的次数,最后输出最大键即可。
- python代码如下
class Solution:
def majorityElement(self, nums: List[int]) -> int:
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
3.2 使用Counter解决:力扣136. 只出现一次的数字
- 题目链接:136. 只出现一次的数字
- 题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。【你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?】
- 解题思路:与上一题十分类似,只是返回值的区别。
- python代码实现:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
counts = collections.Counter(nums)
return min(counts.keys(), key=counts.get)
总结
未完待续~~~。