字典推导式

列表推导式可能我们已经十分熟悉了,但是其实字典推导式也同样非常实用。

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中的字典和集合,都是牺牲空间来换时间。

正如那句话所说世上安得两全法。有得到必须得有牺牲。

初窥门径——字典的更好使用方式相关推荐

  1. 辛星php函数,辛星和您用更简略的方式去实现PHP中的验证码

    辛星和您用更简单的方式去实现PHP中的验证码 说实话,提到验证码我想大家都不会陌生,确实,验证码还是挺常见的,现在搜索一下PHP的验证码类简直是海量的数据,那我们今天就来实现一个自己的验证码把,不过它 ...

  2. javascript 编码规范 用更合理的方式写 javascript

    目录 类型 引用 对象 数组 解构 Strings 函数 箭头函数 构造器 模块 Iterators and Generators 属性 变量 Hoisting 比较运算符和等号 代码块 注释 空白 ...

  3. spring中的依赖注入——构造函数注入、set方法注入( 更常用的方式)、复杂类型的注入/集合类型的注入

    spring中的依赖注入 依赖注入: Dependency Injection IOC的作用:降低程序间的耦合(依赖关系) 依赖关系的管理:以后都交给spring来维护.在当前类需要用到其他类的对象, ...

  4. 选择更安全的方式执行你的puppet更新

    选择更安全的方式执行你的puppet更新 生产环境中,puppet的更新有需要节点自动更新的,有需要通过puppetmaster推送更新的,还有需要节点更新时间离散的.下面讲解三种更新方式 2.7 P ...

  5. 转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

    转自: Springboot - 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端, ...

  6. 更简洁的方式修改Chrome的User Agent,轻松体验移动版网络

    国庆节在家宅着,使用3g上网卡上网,和在公司上网不一样的是:使用上网卡时刻要注意流量问题,毕竟是限定流量的. 理论上访问手机版或者iPad等平板电脑版的网络,应该可以剩些流量的,毕竟移动网络是经过优化 ...

  7. 选择更安全的方式注册你的puppet节点

    选择更安全的方式注册你的puppet节点 1.1Puppet节点注册选型 1.1.1手动注册[root@puppetserver ~]# puppet cert --list #搜索请求注册的节点 & ...

  8. php array 数组去重,更快的方式实现 PHP 数组去重

    如何学习PHP array_flip()定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数 ...

  9. php 数组去重函数,【译】更快的方式实现PHP数组去重

    概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组.这个函数大多数情况下都能工作得很好.但是,如果你尝试在一个大的数组里使用array_u ...

  10. 智慧城市综合管理平台,以一种更智慧的方式促进城市运行

    智慧城市综合管理平台是在新一代信息技术加速发展的背景下,充分运用大数据.云计算.物联网等技术手段对公共服务.社会管理.产业运作等活动的各种需求做出智能响应,将生产.商业.运输.通信.医疗等城市运行的各 ...

最新文章

  1. springmvc 拦截器、国际化、验证
  2. 云栖大会看技术人成长之路
  3. DOM中的setInterval方法
  4. 真人秀制作网站_[BoA] 出道20周年真人秀Nobody Talks To BoA上演与李秀满总制作人充满默契的对话!...
  5. adams2016安装教程
  6. android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点
  7. python kafka获取最新的offset
  8. js实现点击按钮传值
  9. 隐藏在你电脑里面的电影
  10. 异步与多线程的区别 线程安全 (总结)
  11. Codeforces #430 dv.2 842A ,842B
  12. Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph
  13. 西门子S7-1200PLC脉冲控制伺服程序案例 此程序是关于西门子1200PLC以PTO脉冲方式控制伺服电机,步进电机的功能块程序
  14. 4k颜色测试软件,BMPC 4K 使用达芬奇LUT 调色测试
  15. 电脑硬盘恢复数据恢复软件免费版下载
  16. java实现短信发送
  17. 添加网络计算机后打印乱码,Windows7系统打印机无法打印出现乱码的解决方法
  18. AI绘图实战(一):制作购物车图标icon | Stable Diffusion成为设计师生产力工具
  19. 顺序图-循环和分支-操作符的使用
  20. 2022年金属非金属矿井通风上岗证题库及模拟考试

热门文章

  1. CAS:870041-75-0,DMAc-PP,热活化延迟荧光(TADF)材料
  2. 【常用的办公软件】万彩办公大师教程丨文件批量压缩工具
  3. 打开 igv java_IGV加载很久很烦人?三步帮你解决!
  4. 美颜技术---引导滤波 Guided Filter
  5. 【论文阅读】提升的自动作文评分通过Prompt预测和匹配
  6. 华南理工计算机就业棒棒,国内3所校名“一字之差”的大学:均为理工大学,实力却天差地别...
  7. php7 yar扩展,php扩展之Yar使用
  8. LOJ#6198. 谢特【后缀自动机/数组 + Trie树查异或最大值 + Trie树合并】
  9. AD多层板拼板内电层网络丢失处理
  10. 腾讯互娱AMS | 我的打包我做主——浅析前端构建