Python常用库1:collections,容器数据类型

  • collections:数据容器 点这里跳到原文地址
  • 预计阅读时长:10分钟+
  • 未完待续,遇到相关力扣题目,会继续补充~


前言

   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 ,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。
    示例1:
  • 解题思路:借助队列,模拟二叉树的层序遍历。第一步先让根节点进入队列并记录此时队列的大小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)

总结

  未完待续~~~。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想拯救世界_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值