python学习笔记八——字典的方法
4.3.3 字典的方法
字典的常用方法可以极大地提高编程效率。keys()和values()分别返回字典的key列表和value列表。例:
dict={"a":"apple","b":"banana","g":"grape","o":"orange"}
print(dict.keys())
print(dict.values())
[root@Dannyserver danny]# python a.py
dict_keys(['a', 'b', 'g', 'o'])
dict_values(['apple', 'banana', 'grape', 'orange'])
前面已经提到,要获取字典中某个value值,可以使用dict[key]的结构访问。另一种获取value值的办法是使用字典的get(),get()的声明如下:
D.get(k[,d]) ->D[k]
说明:参数k表示字典的键值,参数d可以作为get()的返回值,参数d可以默认,默认值为None。
get()相当于一条if...else...语句,如果参数k在字典D中,get()将返回D[k];如果参数k不在字典中,则返回参数d。例;
#get()的等价语句
D={"key1":"value1","key2":"value2"}
if("key1") in D:
print(D["key1"])
else:
print("None")
[root@Dannyserver danny]# python a.py
value1
下面演示get()的使用
dict={"a":"apple","b":"banana","c":"grape","d":"orange"}
print(dict)
print(dict.get("c","apple")) #使用get获取键为c的值,若不存在返回默认值apple
print(dict.get("e","apple")) #使用get获取键为e的值,若不存在返回默认值aplle
print(dict.get("e")) #若不指定默认值,则返回None
[root@Dannyserver danny]# python a.py
{'a': 'apple', 'b': 'banana', 'c': 'grape', 'd': 'orange'}
grape
apple
None
采用get()访问字典中的value值减少了代码的长度,而且表达方式容易理解,避免使用if语句带来的维护代价。
如果需要添加新的元素到已经存在的字典中,可以调用字典的update()。update()把一个字典中的key和value值全部复制到另一个字典中,update()相当于一个合并函数。update()的声明如下所示:
D.update(E) ->None
把字典E的内容合并到字典D中,update()的等价代码如下所示:
D={"key1":"value1","key2":"value2"}
E={"key3":"value3","key4":"value4"}
for k in E:
D[k]=E[k] #如果字典E中含有字典D中相同的值,字典E的值将覆盖字典D的值
print(D)
[root@Dannyserver danny]# python a.py
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4'}
字典的update()也存在同样的问题,如果某些key在目标字典中已经存在,则更新后新字典中的值将覆盖原有的值。例:
dict1={"a":"apple","b":"banana"}
print(dict)
dict2={"c":"grape","d":"orange"}
dict1.update(dict2) #使用update方法更新dict
print(dict1)
[root@Dannyserver danny]# python a.py
{'a': 'apple', 'b': 'banana'}
{'a': 'apple', 'b': 'banana', 'c': 'grape', 'd': 'orange'}
注意:字典不属于序列,所以字典没有顺序性。update()调用后,字典中各元素的排列顺序是无序的。
字典的setdefault()可以创建新的元素并设置默认值。
D.setdefault(k[,d]) ->D.get(k,d)
说明:setdefault()与get()的使用有些相似,参数k表示字典的键值,参数d表示D[k]的默认值。参数d可以省略,默认值为None。如果参数k的值在字典D中,setdefault()将返回get(k,d)获得的结果;如果参数k的值不在字典D中,字典D将添加新的元素D[k],并调用get(k,d)返回参数d的值。
例:
dict = {}
dict.setdefault("a") #添加一个key值为"a",且设置默认value值为None。
print(dict)
dict["a"]="apple" #更新a的value值为"apple"
dict.setdefault("a","None") #再次调用setdefault设置默认值为None,但是由于设置了dict["a"]的值为"apple",即使再次调用setdefault()也不会影响value的值
print(dict)
[root@Dannyserver danny]# python a.py
{'a': None}
{'a': 'apple'}
下图是字典的一些常用方法:

4.3.4 字典的排序、复制
列表的排序可以使用sorted()实现,字典的排序同样可以使用该函数。例:
#调用sorted()排序
dict={"a":"apple","c":"grape","b":"orange","d":"banana"}
print(dict)
#按照key排序
print(sorted(dict.items(),key=lambda d:d[0]))
#按照value排序
print(sorted(dict.items(),key=lambda d:d[1]))
[root@Dannyserver danny]# python a.py
{'a': 'apple', 'c': 'grape', 'b': 'orange', 'd': 'banana'}
[('a', 'apple'), ('b', 'orange'), ('c', 'grape'), ('d', 'banana')]
[('a', 'apple'), ('d', 'banana'), ('c', 'grape'), ('b', 'orange')]
解释:dict.items()作为需要排序的结合,items()用于字典的遍历,并返回(key,value)元组组成的列表。key=lambda中参数key表示排序的“依据”,d[0]表示items()中的key,即按照key值进行排序,d[1]则表示items()中的value;lambda可以创建匿名函数,用于返回一些计算结果,lambda的使用后面会讲到。
前面提到了update(),这个方法把字典A的内容复制到字典B中,且字典B中原有的内容保持不变,从而实现了字典B的扩展。如果需要把字典A的内容复制到字典B,并清除字典B中原有的内容(覆盖复制),可以使用copy(),声明如下:
D.copy() ->a shallow copy of D
copy()实现了字典的浅拷贝操作,后面还会提到深拷贝的概念以及它们的区别,目前只需知道该方法的使用。下面演示了字典的复制操作
#字典的浅拷贝
dict1={"a":"apple","b":"grape"}
dict2={"c":"orange","d":"banana"}
dict2=dict1.copy() #拷贝dict1并赋给dict2,实现的是覆盖复制,原字典dict2清除
print(dict2)
[root@Dannyserver danny]# python a.py
{'a': 'apple', 'b': 'grape'}
深拷贝能够拷贝对象内部所有的数据和引用,引用相当于C语言中指针的概念,python并不存在指针,但是变量的内存结构中通过引用来维护变量。而浅拷贝只是复制数据,并没有复制数据的引用,新的数据和旧的数据使用同一块内存空间。
例如,字典B浅拷贝字典A的数据,如果字典B的数据发生添加、删除或修改操作,字典A的数据也将发生变化;相反,如果字典B深拷贝字典A的数据,字典B的数据即使发生变化,也不会影响到字典A。
深拷贝和浅拷贝可以应用于python的任何对象,不只是限于字典。在python中可以使用copy模块来实现对象的深拷贝和浅拷贝,deepcopy()用于深拷贝操作,copy()用于浅拷贝操作。
import copy #使用拷贝前必须导入copy模块
dict={"a":"apple","b":{"g":"grape","o":"orange"}}
#字典的深拷贝
dict2=copy.deepcopy(dict)
#字典的浅拷贝
dict3=copy.copy(dict) #copy.copy(dict)等价于dict.copy(),可替换
dict2["b"]["g"]="orange"
print(dict) #深拷贝,拷贝字典元素变化,原字典不变
dict3["b"]["g"]="orange"
print(dict) #浅拷贝,拷贝字典元素变化,原字典改变
[root@Dannyserver danny]# python a.py
{'a': 'apple', 'b': {'g': 'grape', 'o': 'orange'}}
{'a': 'apple', 'b': {'g': 'orange', 'o': 'orange'}}
4.3.5 全局字典——sys.modules模块
sys.modules是一个全局字典,这个字典是python启动后就加载在内存中的。每当程序员导入新的模块,sys.modules都将记录这些模块。字典sys.modules对加载模块起到了缓存的作用。当某个模块第一次导入时,字典sys.modules将自动记录该模块。当第2次再导入此模块时,python会直接到子弹中查找,从而加快了程序运行的速度。
字典sys.modules具有字典所拥有的一切方法,可以通过这些方法了解当前的环境加载了哪些模块。下面这段代码调用了字典的keys()和values()方法,keys()返回当前环境下加载的模块,values()返回这些模块引用路径。
import sys
print(sys.modules.keys()) #keys()返回sys模块以及python自动加载的模块
print(sys.modules.values()) #values()返回模块引用
print(sys.modules["os"]) #返回索引"os"对应的引用
下面这段代码实现了导入模块的过滤
import sys
d=sys.modules.copy() #调用copy()把当前导入的模块信息保存到字典d中
import copy,string #导入copy、string,此时的字典sys.modules包含了原有模块和新导入的两个模块
print(zip(set(sys.modules)-set(d))) #使用zip进行modules的过滤
解释:最后一行代码调用set()把字典sys.modules、字典d存入set集合中,set集合实现了减法运算符,set(sys.modules) - set(d)将返回字典d中没有、而字典sys.modules中存在的模块。然后调用zip()对set集合“解包”,返回一个列表。该列表就是使用import copy、string语句导入的模块。
python学习笔记八——字典的方法的更多相关文章
- python学习笔记(八)、特殊方法、特性和迭代器
1 新式类和旧式类 python类的工作方式在不断变化.较新的Python2版本有两种类,其中旧式类正快速退出舞台.新式类时Python2.2 引入的,提供了一些额外功能,如支持函数super 和 p ...
- 【python学习笔记】9.魔法方法、属性和迭代器
[python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- Python学习笔记之字典
一.创建和使用字典 1.创建字典 phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'} 2.dict,通过映射创建字典 >>> ...
- 【Python学习笔记】字典操作
字典dict是Python中唯一内置的映射类型,由键值对组成,字典是无序的.字典的键必须是不变对象,如字符串.数字.元组等,而包含可变对象的列表.字典和元组则不能作为键.这里可变和不可变的意思是指这个 ...
- Python学习笔记四--字典与集合
字典是Python中唯一的映射类型.所谓映射即指该数据类型包含哈希值(key)和与之对应的值(value)的序列.字典是可变类型.字典中的数据是无序排列的. 4.1.1字典的创建及赋值 dict1={ ...
- python学习笔记之七:魔法方法,属性
在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法).如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名 ...
- Python学习笔记八
类的高级用法 多态: 在其他语言,使用的是类的继承. 在python中,不需要指定数据类型. 基于TCP协议的socket通信实现: 类似于打电话的情景. 服务端: 1.买手机 2.插卡 3.开机 ...
- python学习笔记七——字典
4.3 字典结构 字典是Python中重要的数据类型,字典的由“键-值”对组成的集合,字典中的“值”通过“键”来引用. 4.3.1 字典的创建 字典由一系列的“键-值”(key-value)对组成,“ ...
随机推荐
- Linux 之 rsyslog 系统日志转发
一.rsyslog 介绍 ryslog 是一个快速处理收集系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地,据官网介绍 ...
- Android BaseAdapter加载多个不同的Item布局时出现UncaughtException in Thread main java.lang.ArrayIndexOutOfBoundsException: length=15; index=15
java.lang.ArrayIndexOutOfBoundsException: length=15; index=15 异常出现的场景:在做聊天界面时,需要插入表情,图片,文字,名片,还有几种较为 ...
- 一、java虚拟机内存区域
内存区域 java虚拟机在java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.java虚拟机规范将JVM管理的内存分为:程序计数器.本地方法栈.Java虚拟机栈.方法区.Java堆.如下 ...
- 苹果与Windows双系统时间不同步的解决办法
步骤:打开C盘>Windows>System32,找到cmd.exe,右键以管理员的身份运行. Reg add HKLM\SYSTEM\CurrentControlSet\Control\ ...
- SQL Server中使用convert进行日期转换(转载)
一般存入数据库中的时间格式为yyyy-mm-dd hh:mm:ss 如果要转换为yyyy-mm-dd 短日期格式.可以使用convert函数.下面是sqlserver帮助中关于convert函数的声 ...
- GitHub Git 简单操作
一.使用git更新GitHub 准备:本地已经安装好git 登录GitHub,选择好仓库,点击 Clone or download 拷贝地址 这里的地址为:https://github.com/edw ...
- [SHOI2008]cactus仙人掌图[圆方树+树dp]
题意 求仙人掌的直径(相距最远的两个点的距离). \(n\le 5\times 10^4\) 分析 建立圆方树,讨论答案路径的 lca 在圆点还是方点. 利用树形 dp 求出每个圆点到 不同子树内圆 ...
- 【工作感悟】Android 开发者,如何提升自己的职场竞争力?
前言 该文章是笔者参加 Android 巴士线下交流会成都站 的手写讲稿虚拟场景,所以大家将就看一下. 开始 大家好,我是刘世麟,首先感谢安卓巴士为我们创造了这次奇妙的相遇.现场的氛围也让我十分激动. ...
- 【JVM.3】虚拟机性能监控与故障处理工具
一.概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一套比较完整的理论基础.理论总是作为指导实践的工具,能把这些执行应用到实际工作中才是我们的最终目的.接下来我们会从实践 ...
- pyenv+virtual 笔记
Pyenv + virtualEnv 设置 安装这两个组件是为了适应不同版本的python在同一个系统下的运行:例如现在最明显就是python2.7和python3.6的两个版本,很多库依旧是使用了P ...