初窥门径——字典的更好使用方式
字典推导式
列表推导式可能我们已经十分熟悉了,但是其实字典推导式也同样非常实用。
exam_list = [['alibaba', 'china'],['tencent', 'china'],['orcale', 'america']
]
exam_dict = {compancy:country for compancy,country in exam_list}
exam_dict
{'alibaba': 'china', 'tencent': 'china', 'orcale': 'america'}
其实使用可以像列表推导一样灵活,如我们可以把公司名的前三个字母简称(并首字母大写)作为键,公司全名作为值。
exam_dict = {compancy[:3].capitalize():compancy for compancy,country in exam_list}
{'Ali': 'alibaba', 'Ten': 'tencent', 'Orc': 'orcale'}
事实上你也很难在其他语言上找到比这更优雅的写法。
setdefault方法
我觉得这个方法是字典的精髓所在。下面看一个例子。
如我们要进行词云的计算操作,我们常规的做法是遍历一遍,求出结果。
company_list = ['alibaba', 'alibaba', 'alibaba', 'tencent', 'orcale', 'orcale']
for i in company_list:if i not in company_dict:company_dict[i] = 1else:company_dict[i] += 1
company_dict
{'alibaba': 3, 'tencent': 1, 'orcale': 2}
这是我们的常规处理思路,但我觉得不够优雅。我们其实可以更简洁一点。
for i in company_list:new_company_dict.setdefault(i, []).append(1)
new_company_dict = {key:sum(value) for key, value in new_company_dict.items()}
new_company_dict
{'alibaba': 3, 'tencent': 1, 'orcale': 2}
这样是不是更优雅一点,我也不能断言。但是第一种方法至少要进行三次键查询,而后者则规避了这些。
Counter类
事情上我们在进行上述的计算功能也不用那么麻烦,Counter类已经为我们做好了一切
from collections import Counter
new_com = Counter(company_list)
new_com
Counter({'alibaba': 3, 'tencent': 1, 'orcale': 2})
我们也可以把统计好的结果按着从小到大排列
[('alibaba', 3), ('orcale', 2), ('tencent', 1)]
创建有序字典
在说这句话时候,我们已经明确字典是无序的。其实在常规的理解中很多人认为字典是有序的。他的顺序就是添加到字典的时间顺序。为什么会这么认为呢,实际上在windows中字典里键值对的顺序往往就是添加到字典中的顺序。
但是在linux中往往不是那么回事,为什么python字典是无序的下面再讲。那么关于python创建有序字典可以参考我这篇博客。链接: python 把字典变为有序.
为什么字典的键必须是不可变对象
这个问题想必大家都考虑过,最开始我也想可能因为键值对是一一对应,不可变是为了达到这种对应关系。
可是如果两个列表[1,2,3] 和 [1,2,3,4] 这两个列表是不同的列表,这种不同的列表也无法作为字典的键但是元组却可以。
这种就比较奇怪了,其实字典是python高度优化的一个结构。因为其实有很多时候,字典会在python中有比较巧妙的运用。
python字典的键采用了散列表算法来实现的,所谓的散列表就是哈希表。,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做[散列函数,存放记录的数组叫做散列表。
在python字典中是这样实现高效查询的,为了获取 my_dict[search_key] 背后的值,Python 首先会调用 hash(search_key) 来计算 search_key 的散列值,在散列表里查找表元(具体取几位,得看 当前散列表的大小)。若找到的表元是空的,则抛出 KeyError 异 常。若不是空的,则表元里会有一对 found_key:found_value。 这时候 Python 会检验 search_key == found_key 是否为真,如 果它们相等的话,就会返回 found_value。
这也就是python字典的键必须是不可变的原因,因为要求他是可哈希的。
为什么顺序会打乱
其实不止dict用的散列表,set同样如此。dict 和 set 背后的散列表效率很高,对它的了解越深入,就越能理解 为什么被保存的元素会呈现出不同的顺序,以及已有的元素顺序会发生 变化的原因。同时,速度是以牺牲空间为代价而换来的。
随着我们学习的深入,我们发现db为了实现速度的提升建立索引。数仓为了实现数据的提升,使用分区。再到python中的字典和集合,都是牺牲空间来换时间。
正如那句话所说世上安得两全法。有得到必须得有牺牲。
初窥门径——字典的更好使用方式相关推荐
- 辛星php函数,辛星和您用更简略的方式去实现PHP中的验证码
辛星和您用更简单的方式去实现PHP中的验证码 说实话,提到验证码我想大家都不会陌生,确实,验证码还是挺常见的,现在搜索一下PHP的验证码类简直是海量的数据,那我们今天就来实现一个自己的验证码把,不过它 ...
- javascript 编码规范 用更合理的方式写 javascript
目录 类型 引用 对象 数组 解构 Strings 函数 箭头函数 构造器 模块 Iterators and Generators 属性 变量 Hoisting 比较运算符和等号 代码块 注释 空白 ...
- spring中的依赖注入——构造函数注入、set方法注入( 更常用的方式)、复杂类型的注入/集合类型的注入
spring中的依赖注入 依赖注入: Dependency Injection IOC的作用:降低程序间的耦合(依赖关系) 依赖关系的管理:以后都交给spring来维护.在当前类需要用到其他类的对象, ...
- 选择更安全的方式执行你的puppet更新
选择更安全的方式执行你的puppet更新 生产环境中,puppet的更新有需要节点自动更新的,有需要通过puppetmaster推送更新的,还有需要节点更新时间离散的.下面讲解三种更新方式 2.7 P ...
- 转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
转自: Springboot - 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端, ...
- 更简洁的方式修改Chrome的User Agent,轻松体验移动版网络
国庆节在家宅着,使用3g上网卡上网,和在公司上网不一样的是:使用上网卡时刻要注意流量问题,毕竟是限定流量的. 理论上访问手机版或者iPad等平板电脑版的网络,应该可以剩些流量的,毕竟移动网络是经过优化 ...
- 选择更安全的方式注册你的puppet节点
选择更安全的方式注册你的puppet节点 1.1Puppet节点注册选型 1.1.1手动注册[root@puppetserver ~]# puppet cert --list #搜索请求注册的节点 & ...
- php array 数组去重,更快的方式实现 PHP 数组去重
如何学习PHP array_flip()定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数 ...
- php 数组去重函数,【译】更快的方式实现PHP数组去重
概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组.这个函数大多数情况下都能工作得很好.但是,如果你尝试在一个大的数组里使用array_u ...
- 智慧城市综合管理平台,以一种更智慧的方式促进城市运行
智慧城市综合管理平台是在新一代信息技术加速发展的背景下,充分运用大数据.云计算.物联网等技术手段对公共服务.社会管理.产业运作等活动的各种需求做出智能响应,将生产.商业.运输.通信.医疗等城市运行的各 ...
最新文章
- springmvc 拦截器、国际化、验证
- 云栖大会看技术人成长之路
- DOM中的setInterval方法
- 真人秀制作网站_[BoA] 出道20周年真人秀Nobody Talks To BoA上演与李秀满总制作人充满默契的对话!...
- adams2016安装教程
- android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点
- python kafka获取最新的offset
- js实现点击按钮传值
- 隐藏在你电脑里面的电影
- 异步与多线程的区别 线程安全 (总结)
- Codeforces #430 dv.2 842A ,842B
- Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph
- 西门子S7-1200PLC脉冲控制伺服程序案例 此程序是关于西门子1200PLC以PTO脉冲方式控制伺服电机,步进电机的功能块程序
- 4k颜色测试软件,BMPC 4K 使用达芬奇LUT 调色测试
- 电脑硬盘恢复数据恢复软件免费版下载
- java实现短信发送
- 添加网络计算机后打印乱码,Windows7系统打印机无法打印出现乱码的解决方法
- AI绘图实战(一):制作购物车图标icon | Stable Diffusion成为设计师生产力工具
- 顺序图-循环和分支-操作符的使用
- 2022年金属非金属矿井通风上岗证题库及模拟考试
热门文章
- CAS:870041-75-0,DMAc-PP,热活化延迟荧光(TADF)材料
- 【常用的办公软件】万彩办公大师教程丨文件批量压缩工具
- 打开 igv java_IGV加载很久很烦人?三步帮你解决!
- 美颜技术---引导滤波 Guided Filter
- 【论文阅读】提升的自动作文评分通过Prompt预测和匹配
- 华南理工计算机就业棒棒,国内3所校名“一字之差”的大学:均为理工大学,实力却天差地别...
- php7 yar扩展,php扩展之Yar使用
- LOJ#6198. 谢特【后缀自动机/数组 + Trie树查异或最大值 + Trie树合并】
- AD多层板拼板内电层网络丢失处理
- 腾讯互娱AMS | 我的打包我做主——浅析前端构建