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

924次阅读
没有评论
  • 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 ,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。
    Python常用库1:collections,容器数据类型
  • 解题思路:借助队列,模拟二叉树的层序遍历。第一步先让根节点进入队列并记录此时队列的大小size(为什么要记录此时队列的大小呢,是因为我们要知道每一层有多少个节点,这样我们才知道我们遍历的是哪一层)。根据size的大小去操作队列的弹出与追加,具体操作如下图所示:
    Python常用库1:collections,容器数据类型
  • 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)


总结

  未完待续~~~。

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python基础教程2022-11-22发表,共计2699字。
新手QQ群:570568346,欢迎进群讨论 Python51学习