Python字典里的5个黑魔法
Python里面有3大数据结构:列表,字典和集合.字典是常用的数据结构,里面有一些重要的技巧用法,我把这些都整理到一起,熟练掌握这些技巧之后,对自己的功力大有帮助.
1.字典的排序:
用万金油sorted()函数
举一个简单的例子
my_dict={"cc":100,"aa":200,"bb":10}
print(sorted(my_dict.iteritems(),key=lambda x:x[0]))#表示按照key排序
>>>[('aa', 200), ('bb', 10), ('cc', 100)]
print(sorted(my_dict.iteritems(),key=lambda x:x[1]))#表示按照value排序
>>>[('bb', 10), ('cc', 100), ('aa', 200)]
注意原始的my_dict本身顺序并没有变(不信你可以print看看),排序是通过sorted()返回了一个新的字典
另外一种做法,因为字典是无序,若你一开始设计的时候就希望这个数据结构,按照的添加的顺序进行有序排列(比如读取CSV文件),那么我们就是利用collection模块里面的OrderedDict()处理:
from collections import OrderedDict
orderDict=OrderedDict()
orderDict['a']=1
orderDict['b']=2
orderDict['c']=3
print(orderDict)
>>>OrderedDict([('a', 1), ('b', 2), ('c', 3)])
对比一下,若是普通的dict是乱序的,若不用OrderedDict()
orderDict=dict()
orderDict['a']=1
orderDict['b']=2
orderDict['c']=3
print(orderDict)
>>>{'a': 1, 'c': 3, 'b': 2}
最后要提醒一下:OrderedDict()虽然是好东西,但是它内部维护了一个双向链表,若数据量很大的话,会非常消耗内存.
2.字典的取值
字典中取值大家很容易想到用dict[key],这个有什么难的,确实一般取值是这样的,但是你有没有想过若你取的值不存在,就会发生异常,风险很大.(良好的代码,一定是要考虑健壮性,切记)

因为试图通过索引的方式去取值,比如dict[key],当key不是字典dict的键,会引起异常,有没有什么两全的办法有值的时候取值,没有值的时候即使我取不到也不会发生异常
答案是有的,python早就给你准备好了.我们用dict.get()

建议:尽量用dict.get()来代替dict[key]
3.字典中提取部分子集
我们原来有一个长的字典,我们想提取其中一部分变成另外一个子集,我们怎么做呢,我们来看一个小例子:
students_score={'jack':80,'james':91,'leo':100,'sam':60}
#提取分数超过90分的学生信息,并变成字典
我们可以用字典推导式,轻松搞定
good_score={name:score for name,score in students_score.items() if score>90}
print(good_score)
>>>{'james': 91, 'leo': 100}
4.字典的计算
比如我们有一个字典是记录股票的价格呢,一般key都是股票的名字,而value是价格,若我们想对价格进行计算,应该如何处理呢,我们还是通过实例来讲解:
下面是一个股票价格的字典,我们希望得到里面的最大值,最小值
stocks={'wanke':25.6,'wuliangye':32.3,'maotai':299.5,'huatai':18.6}
一般有几种方法:
利用字典的values():

利用神奇的zip()进行翻转(zip详细用法我前面的文章里面经过,可以从历史文章里面找一下)
是不是对python的用法叹为观止,太神奇了,内置了这么多方便的用法,若用c++,java处理这些问题要好几倍的代码.
5.字典的翻转
在处理复杂的数据结构的时候,有的时候希望把字典翻转,一般用推导列表进行过渡,然后再用dict()函数编程字典:

若碰到比较大的字典,数据量很多很长的时候,最好用Python标准库里的itertools模块(顺便说一下,这个模块非常有用,大家可以关注一下)
from itertools import izip
invert_stocks2=dict(izip(stocks.itervalues(),stocks.iterkeys()))
print(invert_stocks2)
Python字典里的5个黑魔法的更多相关文章
- python字典里的update函数
>>> print d {'age': 34, 'name': 'jeapedu'} >>> d1={"age":38} >>> ...
- Python 字典(Dictionary)
字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: d = ...
- Python字典笔记
1.字典是Python中=唯一的映射类型.映射类型对象里哈希值(键,key)和只指向的对象(值,value)是一对多的关系,一个字典是可变的,是一个容器类型.字典类型和序列类型(元组,列表)的不同在于 ...
- python字典的常用操作方法
Python字典是另一种可变容器模型(无序),且可存储任意类型对象,如字符串.数字.元组等其他容器模型.本文章主要介绍Python中字典(Dict)的详解操作方法,包含创建.访问.删除.其它操作等,需 ...
- Python 字典(Dictionary)操作详解
Python 字典(Dictionary)的详细操作方法. Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一.创建字典 字典由键和对应值成对组成.字 ...
- python字典操作
Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型.一.创建字典字典由键和对应值成对组成.字典也被称作关联数组或哈希表.基本语法如下: 代码如下: dict ...
- Python 字典(Dictionary) has_key()方法
描述 Python 字典(Dictionary) has_key() 函数用于判断键是否存在于字典中,如果键在字典dict里返回true,否则返回false. 语法 has_key()方法语法:dic ...
- Python 字典方法
访问字典的值 字典中的 键/值 实际上就是一种映射关系,只要知道了 “键”,就肯定知道 “值”. >>> my_dict = dict(name = 'zhangsan',other ...
- python字典操作用法总结
基本语法: dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'} 技巧: 字典中包含列表:dict={'yangrong':['23',' ...
随机推荐
- CSP 俄罗斯方块(201604-2)
问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新的由4个小方 ...
- 从入门到自闭之Python内置函数
内置函数一 eval:执行字符串类型的代码 exac:执行字符串社类型的代码 eval与exac 禁止使用 hash()作用就是区分可变数据类型与不可变数据类型 # print(hash(" ...
- win10子系统Ubuntu重置
重置: 在win10命令行下执行: lxrun /uninstall /full 安装: win+R打开bash 执行命令: lxrun /install /y
- Thinkphp5.0上传图片与运行python脚本
这里只体现了php可以通过批处理文件调用python脚本的效果 控制器代码 访问路径为127.0.0.1/index/index/upload. index模块,index控制器,upload方法. ...
- 使用parquet-hadoop.jar包解析hive parquet文件时,遇到FIXED_LEN_BYTE_ARRAY转换为Decimal 以及 INT96转换为timestamp问题
在使用parquet-hadoop.jar包解析parquet文件时,遇到decimal类型的数据为乱码,具体解决方法如下: 使用parquet-Hadoop.jar解析httpfs服务提供的parq ...
- [Next] 五.next自定义内容
自定义 head 这是默认的 head 这样的 head 并不能满足我们的需求.next 公开了一个内置组件,用于将元素追加到<head>标签的.我们可以通过这个自定义 head 新建 c ...
- JavaScript金字塔打印
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C# 之 String.Empty
.NET Framework 类库,表示空字符串,此字段为只读,命名空间:System.程序集:mscorlib(在 mscorlib.dll 中). EG:protected string lo ...
- ubuntu终端安装最新ss
有时候因为加密方式比较新,比如aes-256-gcm,导致旧版本的不能用 一句命令安装ss最新版本 aes-256-gcm加密方式可以用,没毛病
- 自己实现JDK动态代理
实验的目录结构 1.JDK动态代理 先来一段jdk动态代理的demo,首先创建一个接口,Person public interface Person { public void eat(); } 实现 ...