Python处理键映射值操作详解

目录
  • 1. 问题背景
  • 2. collections 概述
    • 2.1 什么是collections
    • 2.2 Collections 内部结构
    • 2.3 collections 使用方法
  • 3. defaultdict 方法
    • setdefault(),对字典key值赋默认值
    • defaultdict(),对字典进行查找取值
  • 4. Counter 方法
  • 总结

作为一个学完Python基础知识的测试,暗喜终于可以像RD们自己写脚本处理任何场景吧,如何优雅地写出来代码,接下来开启进阶版的Python。

本期浅谈一下,collection模块关于键值常用的方法,跟着我一起涨知识吧~

1. 问题背景

在LeetCode刷题时候,经常会创建哈希表来辅助存储数据操作,一说哈希表,小白的我一马无脑就打出了一行tmp = {}。如果在高级点的可以写成 tmp = dict()

直到有一天,遇到1个key存在多个value的问题。那要创建一个value是列表类型的字典,怎么创建呐?(基础太差,知道一对一的)。思考许久删了写写了删,终于使用for循环判断,搞定字典存储key-多个value的值,代码如下:

tmp = {}
students = ["C","A","B","C","D","A","A"]
for index,st in enumerate(students):
    if st not in tmp:
    tmp[st] = []
    tmp[st].append(index)
###
{'C': [0, 3], 'A': [1, 5, 6], 'B': [2], 'D': [4]}
###

饭后找大佬show code,可想而知被大佬的神通广大的见识,直呼涨知识了!。

在 Python内置库中,其实是有一个collection模块提供defaultdict() 方法来专门处理上述遇到的问题,使用defaultdict()实现如上需求,for循环中只需要一行代码即可

from collections import defaultdict
tmp2 = defaultdict(list)
for index,st in enumerate(students):
    tmp2[st].append(index)
##
defaultdict(<class 'list'>, {'C': [0, 3], 'A': [1, 5, 6], 'B': [2], 'D': [4]})
###

听大佬说collection模块可不止这个,还有很多好玩的。带着疑问,去认识collection模块学习。

2. collections 概述

2.1 什么是collections

Python 内置collection模块对普通数据类型(如dict,list,tuple和set)进行扩展和补充。

Collection 模块提供9种扩展的数据类型对象,其中对dict字典扩展的就有5个对象(OrderedDict、ChainMap、defaultdict、UserDict、Counter)。

2.2 Collections 内部结构

Collections模块是集中了collections.abc模块和扩展数据类型如UserDict的容器集合模块, Python中内置的dict存在一些限制,不适合一些场景,因此collections模块提供一些扩展方法。

Collections.abc是从adc抽象基类中导出ABCMeta,abstractmethod进行二次封装成一系列关于集合类的接口如关于映射的mappingmutilmapping抽象基类,用于判断是映射关系抽象类。

实例化映射方法,一般不会直接继承collections.abc抽象基类的,而是是继承Python内置的dict类对象或者collections.UserDict进行拓展。抽象基类作为一个定义映射关系的基本接口。 同时也可以对isinstance来判断该接口是不是映射类型。

port _collections_abc 

tmp = {}
print(isinstance(tmp,collections.abc.Mapping)) 

###
True
### 

2.3 collections 使用方法

Collections 模块提供多种场景的集合类型,在特定场景下,使用它内部的方法可以提高我们代码的运行效率。 collections 模块文档介绍,已经实现对Python 内置数据类型 list,set,tuple和dict都实现的了拓展。

Collections 模块使用时,需要进行提前导入

from collections import xxxxx

3. defaultdict 方法

回到第一节问题,当tmp[st]值不存在时,Python内部会抛出异常KeyError。

我们遇到该问题时,总想的可以对tmp[st]赋值为一个默认值default,即tmp.get(st,default)来消除异常情况。

但是当tmp[st]更新某个值时,需要再次不必要的get查询,导致代码低效。

因此collections模块提供针对快速处理的找不键的情况,提供两种方法:

setdefault(),对字典key值赋默认值

针对第一节,if判断部分可以直接改写为:

# if st not in tmp:
#    tmp[st] = []
# tmp[st].append(index)
#
tmp.setdefault(st,[]).append(index)

虽然提前赋值后,从查询键值次数2到3次,减少一次,但是仍然还要进行插入操作

defaultdict(),对字典进行查找取值

Defaultdict()实现了专门在读取健值就能获取到一个默认值的方法,是通过继承dict进行定义的一个子类,在子类中__missing__方法处理keyerror异常

在第一节中,通过使用defaultdict()来优化,Python内部是怎么运行呢?

比如 tmp2 = defaultdict(list) 当 key- value 不存在tmp2时,tmp2[key]会被进行操作:

  • 调用list()来建立一个new list,作为default_factory实例属性
  • 把new list 作为value,赋值给key键,放在tmp2中 最后返回这个new list的引用

需要注意是,当defaultdict每天指定default_factory时,重新不存在的键会触发keyerror

然而,专门处理keyerror异常的是__missing__()方法,dict类中没有被定义,当__getitem__找不键时候,Python会自动调用__missing__()方法。

4. Counter 方法

在有些时候,我们需要对列表中元素出现的次数进行统计,按照常规思路,仍然要使用for循环查询更新,代码运行效率大大降低。

在 collections模块中提供了Counter()方法,相等于计数器。

那么,Python内部是怎么运行的呢?

Counter 会给键准备一个整数计数器 每更新一个键的时候都会增加这个计数器

Counter 支持对4种形式的写法:

  • 创建空计数器:tmp = Counter()
  • 支持迭代对象如字符串: tmp = Counter("juejin")
  • 支持映射对象如字典:tmp = Counter({"a":3,"b":4})
  • 支持key=value形式:tmp = Counter(jue=1,jin=2)

Counter对象还支持求出most_common([n])求前n最大的key-value字典等方法

总结

Collections 模块提供对可变序列映射类型高性能方法,OrderedDict、ChainMap和Counter方法可以直接进行调用使用。如果需要重新定义则组需要继承UserDict来实现个性化。

本期,我们只学习了collections模块中关于处理键映射类型的相关方法,后续继续对collections模块关于set、list提供的扩展方法进行学习研究。

到此这篇关于Python处理键映射值操作详解的文章就介绍到这了,更多相关Python键映射值操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-11-11

python进阶collections标准库使用示例详解

目录 前言 namedtuple namedtuple的由来 namedtuple的格式 namedtuple声明以及实例化 namedtuple的方法和属性 OrderedDict popitem(last=True) move_to_end(key, last=True) 支持reversed 相等测试敏感 defaultdict 小例子1 小例子2 小例子3 Counter对象 创建方式 elements() most_common([n]) 应用场景 deque([iterable[,

Python collections模块的使用技巧

一般来讲,python的collections是用于存储数据集合(比如列表list, 字典dict, 元组tuple和集合set)的容器.这些容器内置在Python中,可以直接使用.该collections模块提供了额外的,高性能的数据类型,可以增强你的代码,使事情变得更清洁,更容易. 让我们看一看关于集合模块最受欢迎的数据类型以及如何使用它们的教程! Counter Counter()是字典对象的子类.Counter()可接收一个可迭代遍历的对象(例如字符串.列表或元组)作为参数,并返回计数器

python collections模块的使用

collections模块 collections模块:提供一些python八大类型以外的数据类型 python默认八大数据类型: - 整型 - 浮点型 - 字符串 - 字典 - 列表 - 元组 - 集合 - 布尔类型 1.具名元组 具名元组只是一个名字 应用场景: ① 坐标 # 应用:坐标 from collections import namedtuple # 将"坐标"变成"对象"的名字 # 传入可迭代对象必须是有序的 point = namedtuple(&

Python collections模块的使用方法

collections模块 这个模块实现了特定目标的容器,以提供Python标准内建容器 dict.list.set.tuple 的替代选择. Counter:字典的子类,提供了可哈希对象的计数功能 defaultdict:字典的子类,提供了一个工厂函数,为字典查询提供了默认值 OrderedDict:字典的子类,保留了他们被添加的顺序 namedtuple:创建命名元组子类的工厂函数 deque:类似列表容器,实现了在两端快速添加(append)和弹出(pop) ChainMap:类似字典的容

了解一下python内建模块collections

在使用Python的过程中,一定是离不开数据结构的, 也就是List-列表,Tuples-元组,Dictionaries-字典. 那实际应用中我们更多的还是要去操作这些结构里的数据.比如,在列表后面添加元素,那么就会用到append() 方法. 那除了这些本身的操作方法之外,还有一个Python内建模块--collections,也提供了不少使用的方法,今天来捋一下. 一.Counter 这是一个计数器,我们可以用来方便的统计出一些元素出现的次数,比如String.List.Tuples等等.

Python中内建模块collections如何使用

collections是Python内建的一个集合模块,提供了许多有用的集合类. 这里举几个例子: namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>> p = (1, 2) 但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的. 定义一个class又小题大做了,这时,namedtuple就派上了用场: >>> from collections import namedtuple >>>

Python内建模块struct实例详解

本文研究的主要是Python内建模块struct的相关内容,具体如下. Python中变量的类型只有列表.元祖.字典.集合等高级抽象类型,并没有像c中定义了位.字节.整型等底层初级类型.因为Python本来就是高级解释性语言,运行的时候都是经过翻译后再在底层运行.如何打通Python和其他语言之间的类型定义障碍,Python的内建模块struct完全解决了所有问题. 知识介绍: 在struct模块中最最常用的三个: (1)struct.pack:用于将Python的值根据格式符,转换为字符串(因

使用Python的内建模块collections的教程

collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>> p = (1, 2) 但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的. 定义一个class又小题大做了,这时,namedtuple就派上了用场: >>> from collections import namedtuple >>> Point = n

Python内建类型list源码学习

目录 问题: 1 常用方法 小结: 题外话: 2 list的内部结构:PyListObject 3 尾部操作和头部操作 3.1 尾部操作 3.2 头部操作 4 浅拷贝和深拷贝 4.1 浅拷贝 4.2 深拷贝 4.3 直接赋值 4.4 小结 个人总结: TODO: 5 动态数组 5.1 容量调整 5.2 append() 5.3 insert() 5.4 pop() 5.5 remove() 6 一些问题 问题: “深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种

python内建类型与标准类型

目录 前言 理解对象和类型 关于不可变类型和可变类型 关于动态静态强弱类型 标准类型 其它内建类型 类型的类型 None ->空类型 内建类型的布尔值 前言 全可以访问相同的对象, 因此我们讲 这种变量名也叫对象的 "引用". 验证1: a = 2 b = 3 print(id(a),id(b))  #140734889681584 140734889681616 b = 2 print(id(b))    #140734889681584 验证2: b = 3 print(id

深入理解Node内建模块和对象

在 node 核心中有些内建模块,使用这些模块可以操作系统,文件和网络.打开 nodejs.org 官网可以看到文档中对应版本的 API ,推荐使用稳定版. 当然也不全是模块,比如 console . buffer 是对象,这里简单的讲下一些常用的内建模块. 比如有操作文件系统的 filename .可以创建监听 HTTP 请求的网络服务的 HTTP .还有操作系统的 OS 模块.还有 path ,操作路径. process 可以返回我们现在正在处理的信息. QueryString 用来创建 h

Python内建属性getattribute拦截器使用详解

目录 引言 1.内建属性__getattribute__的用法 2.重写__getattribute__实现属性拦截功能 总结要点: 引言 因为python中所有类默认继承object类. 而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性. 可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多.而很多系统提供的内建属性实际开发中用户都需要重写后才会使用. 对于python来说,属性或者函数都可以被理解成一

Python内建类型bytes深入理解

目录 引言 1 bytes和str之间的关系 2 bytes对象的结构:PyBytesObject 3 bytes对象的行为 3.1 PyBytes_Type 3.2 bytes_as_sequence 4 字符缓冲池 引言 “深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建类型. 在我们日常的开发中,str是很常用的一个内建类型,与之相关的我们比较少接触的就是bytes,这里先为大家介绍一下bytes相关的知识点,下一篇博客再详细介绍str的相关内容

Python内建类型int源码学习

目录 1 int对象的设计 1.1 PyLongObject 1.2 整数的布局 1.3 小整数静态对象池 1.4 示例 2 大整数运算 2.1 整数运算概述 2.2 大整数运算处理过程 1.long_add()源码: 2.绝对值加法x_add() 3 其他 大整数转float溢出 “深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建类型. 问题:对于C语言,下面这个程序运行后的结果是什么?是1000000000000吗? #include <stdio