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键映射值操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 了解一下python内建模块collections

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

  • Python collections模块的使用技巧

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

  • 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模块的使用

    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处理键映射值操作详解

    目录 1. 问题背景 2. collections 概述 2.1 什么是collections 2.2 Collections 内部结构 2.3 collections 使用方法 3. defaultdict 方法 setdefault(),对字典key值赋默认值 defaultdict(),对字典进行查找取值 4. Counter 方法 总结 作为一个学完Python基础知识的测试,暗喜终于可以像RD们自己写脚本处理任何场景吧,如何优雅地写出来代码,接下来开启进阶版的Python. 本期浅谈一

  • python列表切片和嵌套列表取值操作详解

    给出列表切片的格式: [开头元素::步长] # 输出直到最后一个元素,(最后一个冒号和步长可以省略,下同) [开头元素:结尾元素(不含):步长] # 其中,-1表示list最后一个元素 首先来看最简单的单一列表: a = [1,2,3,4] a[:] a[::] a[:3] a[1:3:2] a[3] 输出依次为: [1,2,3,4] [1,2,3,4] [1,2,3] [2] 4 注意,这里只有最后一个输出是不带[]的,表明只有最后一个输出是元素,其他在切片中只用了:符号的输出均为list,不

  • python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 = "hello bei jing " name2 = '''hello shang hai haha''' python中的字符串一旦声明,是不能进行更改的,如下: #字符串为不可变变量,即不能通过对某一位置重新赋值改变内容 name = 'hello' name[0] = 'k' #通

  • Python Pandas学习之基本数据操作详解

    目录 1索引操作 1.1直接使用行列索引(先列后行) 1.2结合loc或者iloc使用索引 1.3使用ix组合索引 2赋值操作 3排序 3.1DataFrame排序 3.2Series排序 为了更好的理解这些基本操作,下面会通过读取一个股票数据,来进行Pandas基本数据操作的语法介绍. # 读取文件(读取保存文件后面会专门进行讲解,这里先直接调用下api) data = pd.read_csv("./data/stock_day.csv")  # 读取当前目录下一个csv文件 # 删

  • Python YAML文件的读写操作详解

    目录 YAML格式 YAML文件 YAML操作 读取 存储 示例 转字典 转列表 YAML是一种数据序列化格式,方便人类阅读,且容易和脚本语言交互.常用于配置文件,也用于数据存储或传输. YAML格式 YAML三种基本数据类型: 1.标量:如字符串.整数和浮点数.日期 布尔值:“true”.“True”.“TRUE”.“yes”.“Yes"和"YES”,“false”.“False”.“FALSE”.“no”.“No"和"NO” 空:null.Null.~或不指定值

  • python 引用传递和值传递详解(实参,形参)

    python中函数参数是引用传递(不是值传递).对于不可变类型,因变量不能被修改,所以运算时不会影响到变量本身:而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量. 形参: 函数需要传递的参数 实参:调用函数时传递的参数 补充知识:python函数方法实参给形参传值时候的隐形'陷阱' 众所周知,在python函数里面参数分为形参,实参两种.形参当然了就是形式参数,而实参是我们需要给这个函数传入的变量,在我们给实参传入变量之后,调用函数,实参则自动会把数值或则变量赋予形参,从而通过函数得

  • Python读写JSON文件的操作详解

    目录 JSON JSON 起源 JSON 样例 Python 原生支持 JSON 序列化 JSON 简单的序列化示例 JSON 反序列化 简单的反序列化示例 应用案例 编码和解码 JSON JSON 起源 JSON 全称 JavaScript Object Notation .是处理对象文字语法的 JavaScript 编程语言的一个子集.JSON 早已成为与语言无关的语言,并作为自己的标准存在. JSON 样例 { "data":[ { "id": "1

  • Python实现数据的序列化操作详解

    目录 Json 模块 dumps()函数 dump()函数 loads()函数 load()函数 Pickle 模块 dumps()函数 dump()函数 loads()函数 load()函数 总结 ​在日常开发中,对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块.这两个模块主要区别如下: json 是一个文本序列化格式,而 pickle 是一个二进制序列化格式: json 是我们可以直观阅读的,而 p

  • python四则运算表达式求值示例详解

    目录 四则运算表达式求值 思路说明 算法步骤 代码 四则运算表达式求值 思路说明 使用双栈来实现——存放数值的栈 nums 与存放运算符的栈 ops. 算法步骤 对原始表达式字符串 exp 进行预处理, 将其转为一个元素对应一个数值或运算符的列表 explist. 遍历 explist , 每个元素依次压入对应的栈中. 每次压入后, 判断当前两栈顶是否可进行乘除运算.栈顶可进行乘除运算的充要条件是, ops 栈顶为<*> ,</> 之一, 且 nums 中的元素比 ops 中的元素

  • Python学习之字符串常用操作详解

    目录 1.查找字符串 2.分割字符串 3.连接字符串 4.替换字符串 5.移除字符串的首尾字符 6.转换字符串的大小写 7.检测字符串(后续还会更新) 1.查找字符串 除了使用index()方法在字符串中查找指定元素,还可以使用find()方法在一个较长的字符串中查找子串.如果找到子串,返回子串所在位置的最左端索引,否则返回-1. 语法格式: str.find(sub[,start[,end]]) 其中,str表示被查找的字符串.sub表示查找的子串.start表示开始索引,缺省时为0.end表

随机推荐